【问题标题】:C++ variadic template to replace typelist替换类型列表的 C++ 可变参数模板
【发布时间】:2013-09-13 16:02:27
【问题描述】:

我想利用可变参数模板来替换下面的标准类型列表代码。另外,请注意,这使用 int 作为类型。我正在尝试合并 C++11 定义的强类型枚举,所以我想用模板参数类型替换 int HEAD。

template <int HEAD, class TAIL>
struct IntList {
  enum { head = HEAD };
  typedef TAIL tail;
};

struct IntListEnd {};

#define LIST1(a) IntList<a,IntListEnd>
#define LIST2(a,b) IntList<a,LIST1(b) >
#define LIST3(a,b,c) IntList<a,LIST2(b,c) >
#define LIST4(a,b,c,d) IntList<a,LIST3(b,c,d) >

这是我想要走的路:

template <class T, T... Args> 
struct vlist;

template <class T, T value, T... Args>
struct vlist {
  T head = value;
  bool hasNext() { 
    if (...sizeof(Args) >=0 ) 
      return true; 
  }
  vlist<T,Args> vlist;
  vlist getNext () { 
    return vlist;
  }
};

template <class T> 
struct vlist { };

初始化这个的例子应该和下面类似:

enum class FishEnum { jellyfish, trout, catfish };
vlist <FishEnum, FishEnum::jellyfish, FishEnum::trout, FishEnum::catfish> myvlist;

我已经在论坛中搜索了一个模板结构的好例子,它可以接受类型和类型值而没有运气。关于从这里去哪里有什么建议吗?我从上面的代码中粘贴了我的编译错误,

note: previous declaration 'template<class T, T ...Args> struct vlist' used 2 template parameters
template <class T, T... Args> struct vlist;
                                     ^
error: redeclared with 1 template parameter
struct vlist { };
       ^
note: previous declaration 'template<class T, T ...Args> struct vlist' used 2 template parameters
template <class T, T... Args> struct vlist;

【问题讨论】:

    标签: c++ c++11 enums variadic-templates typelist


    【解决方案1】:

    您缺少基本模板的许多参数扩展和特化。需要记住的一件事:一旦您声明了基础模板,所有其他模板都必须是该基础的专业化

    // Base template
    template <class T, T... Args> 
    struct vlist;
    
    // Specialization for one value
    template <typename T, T Head>
    struct vlist<T, Head>
    {
        T head = Head;
        constexpr bool has_next() const { return false; }
    };
    
    // Variadic specialization
    template <class T, T Value, T... Args>
    struct vlist<T, Value, Args...> 
    {
        T head = Value;
    
        constexpr bool has_next() const { return true; }
    
        constexpr vlist<T, Args...> next() const
        { 
            return vlist<T, Args...>();
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      相关资源
      最近更新 更多