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

标签 c++ templates tuples c++17 template-argument-deduction

假设我有一个类型

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

我想创建一个类来接受 Pass 对象的列表,每个对象都有任意的 TU 并生成 3 std::tuples.

像这样:

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/

相关文章:

c++ - 为什么链接器不能防止 C++ 静态初始化顺序失败?

c++ - 使用 visual stdio2008 的线程

c++ - 'v8::Value::ToNumber': 被宣布弃用

python - 在python中将字符串转换为元组

python - 从字符串中创建元组列表,,

c++ - NIC的TX/RX buffer中的数据是如何传输到dpdk ring buffer而不是kernel ring buffer的?

templates - 使用 EditorFor<> 呈现下拉列表

c++ - 如何重新排序功能参数?

C++ 模板函数,可以采用 Eigen::vector 或 std::vector

python - 无法通过附加到列表理解创建的列表来在单个语句中创建元组