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,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;
生产:
front(lst1): i
front(lst2): f
front(lst3): d
front(lst4): c
当然,后退功能是下一步,但是,我似乎无法让它工作.我的代码
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,~~~~~~~~~~~~~~~~~~~^~~~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不会触发?
解决方法 std :: conditional的使用不当std::conditonal<condition,true-type,false-type>
你的问题归结为std :: conditional中的true和false类型都必须产生一个有效的名字,无论条件选择哪一方.
注意:如果不需要完整的解释,本文末尾有一个建议的解决方案.
考虑以下示例:
struct A { typedef int type; };struct B { /* empty */ };
template<class T>struct some_trait { typedef typename std::conditional< /* condition -> */ std::is_same<T,A>::value,/* true-type -> */ typename T::type,/* false-type -> */ voID >::type result;};
实例化some_trait< A>将完全有效,但如果我们用B实例化会发生什么?
template<>struct some_trait<B> { typedef typename std::conditional< std::is_same<B,typename B::type,// (A),ill-formed voID >::type result;};
在上面我们假装是一个编译器,并且我们用B替换了每个T的出现,但这并不是那么辛苦,但它已经在我们的主模板中引发了一个非常重要的问题.
当编译器实例化some_trait< T>时如果T = B,我们的std :: conditional中的true类型将是B :: type(A).
但是由于B里面没有名字叫做类型,我们会得到一个编译器诊断说我们的代码有问题,即;我们正在尝试访问不存在的名称.
foo.cpp:15:37: error: no type named 'type' in 'B' /* true-type -> */ typename T::type,ill-formed
提出的解决方案
毫无疑问,我们必须做些什么,并简而言之;阻止我们的模板访问可能不存在的名称.
这样做的一个简单方法是依赖显式特化,而不是使用std :: conditional.
后面的示例实现
template<typename TypeList>struct back { typedef typename back<typename TypeList::Tail>::type type;};template<typename T>struct back<type_List<T>> { typedef typename type_List<T>::head type;};
注意:如果模板的实例化< typename T>结构;是一个只有一个参数的type_List,我们知道我们在最后一个节点.
总结以上是内存溢出为你收集整理的c – 在实施类型列表时苦苦挣扎全部内容,希望文章能够帮你解决c – 在实施类型列表时苦苦挣扎所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)