我正在使用C ++ 11,我需要像变换(容器的stl算法)之类的东西,它可以转换template<typename ...T
&gt;进入<typename ...T::something>
所以我可以用它来继承:
例如:
template<typename T>
struct typeOf{
using type = T;
};
template<typename ...T> // All the arguments must be `typeOf`'s
class tupleOf : tuple<T::type...>{
}
这样:
tupleOf<typeOf<int>,typeOf<char>>
会给我一个tuple<int,char>
我想在不使用C ++ 14功能的情况下执行此操作
答案 0 :(得分:2)
您可以执行以下操作:
template <typename T, template <typename> class f>
struct transform;
template <template <typename...> class C, typename...Ts, template <typename> class f>
struct transform<C<Ts...>, f>
{
using type = C<typename f<Ts>::type...>;
};
用法:
static_assert(std::is_same<std::tuple<char, int>,
transform<std::tuple<char*, int*>,
std::remove_pointer>::type>::value,
"unexpected");
答案 1 :(得分:1)
如果您只想找到解决特定问题的简单解决方案,这应该适合您:
namespace detail {
//primary template for when something invalid is passed
//could add a static_assert to improve compiler message
template<typename... T> struct tupleOf;
//partial specialization for when a list of typeOf types are passed
template<typename... Ts>
struct tupleOf<typeOf<Ts>...>
{
using type = std::tuple<Ts...>;
};
}
//alias template for ease-of-use
template <typename... Ts>
using tupleOf = typename detail::tupleOf<Ts...>::type;
现在tupleOf<typeOf<int>,typeOf<char>>
相当于std::tuple<int,char>
。
答案 2 :(得分:0)
简单转换已经在模式扩展的上下文中工作。如果您只是添加typename
关键字,原始代码应该可以正常运行。
template<typename T>
struct typeOf{
using type = T;
};
template<typename ...T> // All the arguments must be `typeOf`s
class tupleOf : tuple<typename T::type...>{
};
虽然模板别名可能是更好的选择。
template <typename... T>
using tupleOf = tuple<typename T::type...>;