为参数包中的每种类型推导模板参数类型

Deducing template parameter types for each type in parameter pack

假设我有一个类型

template <class T, class U>
class Pass
{
};

我想创建一个 class 来接受 Pass 个对象的列表,每个对象都有任意的 TU 并生成 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;