3

可変個引数テンプレートを利用して、以下の標準のタイプリスト コードを置き換えたいと思います。また、これは型として 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;
4

1 に答える 1