【发布时间】:2012-07-30 14:33:18
【问题描述】:
我试图从类型E = T<T2,T3> 中推断出底层模板类型T。例如,这可以使模板函数pair_maker(const E & a) 可以与几种类似类型的容器之一一起使用。粗略的元代码:
template <typename T>
auto pairmaker(const E & a) -> PairContents<E,std::string>::type {
ContainerPairMaker<E,std::string>::type output;
... some code ...
return output;
}
PairContents<E,std::string>
会将vector<int> 类型转换为vector<pair(int,std::string)> 或whatever<T1> 转换为whatever<pair(T1,std::string)>。
类型剖析的另一个类似示例是 std::array (或类似容器),我想找出 container 类型以创建一个新的类似数组。例如对于这些类型的函数(这是现在实际工作的代码)
template <typename T >
auto make_some3(const T & a)
-> std::array<typename T::value_type,10*std::tuple_size<T>::value>{
return std::array<typename T::value_type,10*std::tuple_size<T>::value>{} ;
}
这很好用,但我想要的是自动显式使用“std::array”。
对于 std::array 有 tuple_size 特性有帮助,类似的东西可用于为任何第二个参数找到 type,但我还是想不出任何找到容器类型的方法。
总结一下:什么样的机器(如果有的话)可以用于这些情况。在何种程度上可以处理模板参数、模板-模板参数、任意数量的参数和未知类型的非模板参数的混合。
【问题讨论】:
-
问题是,如果您仅重新绑定第一个参数,标准容器将有一个不匹配的分配器,也就是
PairContent<vector<int, allocator<int>>,float>::type将是vector<pair<int,float>, allocator<int>>。 -
作为术语,
T<T2, T3>T不是类型。您正在寻找的是基础类模板T,其中T<T2, T3>是一个特化(和一个类型)。因此你不能让extract<std::vector<int>>::type成为std::vector。 -
Xeo,哦……这是个大问题。您为什么不将其带入您现在已删除的答案中?
标签: c++ templates c++11 metaprogramming