假设我有一个类型
template <class T, class U>
class Pass
{
};
我想创建一个类来接受 Pass
对象的列表,每个对象都有任意的 T
和 U
并生成 3 std::tuple
s.
像这样:
template<template <typename P1, typename P2> class... T>
class Test
{
public:
Test(T<P1, P2>... passes) {}
std::tuple<T<P1, P2>...> tuple1;
std::tuple<P1...> tuple2;
std::tuple<P2...> tuple3;
};
然后创建一个实例:
Test t{ Pass<int, float>(), Pass<int, int>(), Pass<std::string, float>() };
这可能吗?
最佳答案
是的:
template <typename... >
struct Test;
template <typename... T, typename... U>
struct Test<Pass<T, U>...>
{
Test(Pass<T, U>...);
std::tuple<Pass<T, U>...> tuple1;
std::tuple<T...> tuple2;
std::tuple<U...> tuple3;
};
template <typename... T, typename... U>
Test(Pass<T, U>...) -> Test<Pass<T, U>...>;
我们在这里需要推导指南,因为类模板参数推导仅隐式考虑主模板的构造函数,而在这种情况下主模板没有构造函数。
注意这个声明:
template <template <typename P1, typename P2> class... T>
struct X { };
与此声明的含义相同:
template <template <typename, typename> class... T>
struct X { };
这意味着二进制类模板的参数包 - 不是特定类型。这样的类模板可以实例化为:
X<Pass, std::pair, std::vector> x;
关于c++ - 为参数包中的每种类型推导模板参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57557535/