为 TypeList 实现 Loki IndexOf

Posted

技术标签:

【中文标题】为 TypeList 实现 Loki IndexOf【英文标题】:Implementation of Loki IndexOf for a TypeList 【发布时间】:2012-05-24 10:25:57 【问题描述】:

我正在实现一个基于 Loki 的 TypeList,基于以下内容:

http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s09.html

并从网站上看到了 IndexOf 的这段代码(在类型列表中查找类型的索引):

template <class T>
struct IndexOf< NullType, T>

    enum  value = -1 ;
;

template <class T, class Tail>
struct IndexOf< Typelist<Head, Tail>, T>

private:
    enum  temp = IndexOf<Tail, T>::value ;
public:
    enum  value = (temp == -1) ? -1 : 1+temp ;
;

这似乎行不通,因为在递归遍历列表时,我在任何地方都看不到比较 T 的东西。在我的实现中,它看起来像这样:

template<typename Tlist, typename T>
struct IndexOf

private:
  static const int temp = IndexOf<typename Tlist::Tail, T>::value;
public:
  static const int value = (temp == -1) ? -1 : 1 + temp;
;

template<typename T>
struct IndexOf<NullType, T>

  static const int value = -1;
;

事实上,总是返回 -1。如果我想到它,想象一个有 TypeList;然后 Tail 将是 NullType,因此 temp 将通过专业化为 -1,然后 value 将为 -1 ..即使 Head 是 char 而我预计为零。我在这里错过了什么?

谢谢


我对 Typelist 的实现仅仅是:

template<typename H, typename T>
struct Typelist

  typedef H Head;
  typedef T Tail;
;

我猜这不是 Lokis,但随着 Joel 的回答,我得到了这个为我工作:

template<typename Head, typename Tail, typename T>
struct IndexOfImpl

private:
  static const int temp = IndexOfImpl<typename Tail::Head, typename Tail::Tail, T>::value;
public:
  static const int value = (temp == -1) ? -1 : temp + 1;
;

template<typename T, typename Tail>
struct IndexOfImpl<T, Tail, T>

  static const int value = 0;
;

template<typename T>
struct IndexOfImpl<T, NullType, T>

  static const int value = 0;
;

template<typename Head, typename T>
struct IndexOfImpl<Head, NullType, T>

  static const int value = -1;
;

template<typename Tlist, typename T>
struct IndexOf

 public:
  static const int value = IndexOfImpl<typename Tlist::Head, typename Tlist::Tail, T>::value;
;

【问题讨论】:

您应该不需要 案例。那你有什么歧义吗? 【参考方案1】:

应该是:

template <class T>
struct IndexOf< NullType, T>

    enum  value = -1 ;
;

template <class T, class Head, class Tail>
struct IndexOf< Typelist<Head, Tail>, T>

private:
    enum  temp = IndexOf<Tail, T>::value ;
public:
    enum  value = (temp == -1) ? -1 : 1+temp ;
;

template <class T, class Tail>
struct IndexOf< Typelist<T, Tail>, T>

public:
    enum  value = 0 ;
;

您尝试在列表的递归编码中的某个 Head 处找到 T。

【讨论】:

谢谢!从我对 Typelist 的简单实现中,我必须将其翻译为上述内容(编辑我的答案)

以上是关于为 TypeList 实现 Loki IndexOf的主要内容,如果未能解决你的问题,请参考以下文章

使用loki+promtail实现云原生日志分析

使用 Loki 实现 Kubernetes 容器日志监控

使用 Loki 实现 Kubernetes 容器日志监控

Loki日志收集单进程模式部署

5分钟搞定Loki告警多渠道接入

在“现代 C++ 设计”/Loki 中发现的小对象分配器是不是已被弃用以支持更新的实现?