【发布时间】:2014-07-27 23:09:50
【问题描述】:
出于教育目的,我想编写自己的基于c++11 的类型列表。裸列表如下所示:
template <typename ... Ts> struct type_list;
template <typename T, typename ... Ts>
struct type_list<T, Ts ...> {
typedef T Head;
typedef type_list<Ts ...> Tail;
};
template <typename T> struct type_list<T> {
typedef T Head;
typedef null_type Tail;
};
我创建了一个名为front 的函数来提取第一个元素:
template <typename T> struct front;
template <typename TypeList>
struct front {
typedef typename TypeList::Head type;
};
按预期工作,即此代码
typedef type_list<int> lst;
typedef type_list<float,int> lst2;
typedef type_list<double,float,int> lst3;
typedef type_list<char,double,float,int> lst4;
std::cout << "front(lst1): " << typeid( front<lst>::type ).name() << std::endl;
std::cout << "front(lst2): " << typeid( front<lst2>::type ).name() << std::endl;
std::cout << "front(lst3): " << typeid( front<lst3>::type ).name() << std::endl;
std::cout << "front(lst4): " << typeid( front<lst4>::type ).name() << std::endl;
产生:
前(lst1):我
前(lst2):f
前(lst3):d
前(lst4):c
当然,back 函数是下一步,但是,我似乎无法让它工作。我的代码
template <typename T> struct back;
template <typename TypeList>
struct back {
typedef typename std::conditional<std::is_same<typename TypeList::Tail, null_type>::value,
typename TypeList::Head,
typename back<typename TypeList::Tail>::type>::type type;
};
不编译 (clang 3.2) [lst 定义如前]:
TypeList.cc:33:71: error: no type named 'Tail' in 'null_type'
typedef typename std::conditional<std::is_same<typename TypeList::Tail, null_type>::value,
~~~~~~~~~~~~~~~~~~~^~~~
TypeList.cc:35:20: note:
in instantiation of template class 'back<null_type>' requested here
typename back<typename TypeList::Tail>::type>::type type;
^
TypeList.cc:54:44: note:
in instantiation of template class 'back<type_list<int> >' requested here
std::cout << "back(lst1): " << typeid( back<lst>::type ).name() << std::endl;
^
1 error generated.
问题
- 为什么
std::conditional没有触发?
【问题讨论】:
-
我认为您不应该拥有
T1和T2。一个T就足够了。 -
@KerrekSB 这是正确的,但不能解决我原来的问题。不过,感谢您指出!我相应地编辑了代码。
标签: c++ templates c++11 metaprogramming template-meta-programming