2013-09-10 4 views
2

Я бы хотел использовать вариативные шаблоны для замены этого ниже стандартного кода списка. Кроме того, обратите внимание: здесь используется тип int. Я пытаюсь включить строго типизированные перечисления, как определено C++ 11, поэтому я хочу заменить int HEAD на тип параметра шаблона.C++ variadic template для замены typelist

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; 

Я искал на форумах хороший пример шаблона struct, который может принять тип и значения типа без везения. Любые предложения о том, куда идти отсюда? Я приклеила мои ошибки компиляции ниже из приведенного выше кода,

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; 

ответ

6

Вы пропустили несколько параметров расширения и специализации для базового шаблона. Одна вещь, чтобы иметь в виду: как только вы объявили базовый шаблон, все остальные шаблоны должны быть специализаций из этой базы:

// 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...>(); 
    } 
}; 
Смежные вопросы