为参数包中的每种类型推导模板参数类型
Deducing template parameter types for each type in parameter pack
假设我有一个类型
template <class T, class U>
class Pass
{
};
我想创建一个 class 来接受 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>...>;
我们在这里需要推导指南,因为 class 模板参数推导仅隐含地考虑主模板的构造函数,而在这种情况下主模板没有构造函数。
注意这个声明:
template <template <typename P1, typename P2> class... T>
struct X { };
与此声明的含义相同:
template <template <typename, typename> class... T>
struct X { };
这意味着二进制 class 模板的参数包 - 不是特定类型。这样的 class 模板可以实例化为:
X<Pass, std::pair, std::vector> x;
假设我有一个类型
template <class T, class U>
class Pass
{
};
我想创建一个 class 来接受 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>...>;
我们在这里需要推导指南,因为 class 模板参数推导仅隐含地考虑主模板的构造函数,而在这种情况下主模板没有构造函数。
注意这个声明:
template <template <typename P1, typename P2> class... T>
struct X { };
与此声明的含义相同:
template <template <typename, typename> class... T>
struct X { };
这意味着二进制 class 模板的参数包 - 不是特定类型。这样的 class 模板可以实例化为:
X<Pass, std::pair, std::vector> x;