Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 推断参数包中每种类型的模板参数类型_C++_Templates_Tuples_C++17_Template Argument Deduction - Fatal编程技术网

C++ 推断参数包中每种类型的模板参数类型

C++ 推断参数包中每种类型的模板参数类型,c++,templates,tuples,c++17,template-argument-deduction,C++,Templates,Tuples,C++17,Template Argument Deduction,假设我有一个 template <class T, class U> class Pass { }; 然后创建一个实例: Test t{ Pass<int, float>(), Pass<int, int>(), Pass<std::string, float>() }; 有可能吗?有: template <typename... > struct Test; template <typename... T, typenam

假设我有一个

template <class T, class U>
class Pass
{
};
然后创建一个实例:

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 { };
与本声明的含义相同:

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;
是的:

这里我们需要演绎指南,因为类模板参数演绎只隐式地考虑主模板的构造函数,在这种情况下,主模板没有构造函数

请注意,本声明:

template <template <typename P1, typename P2> class... T>
struct X { };
template <template <typename, typename> class... T>
struct X { };
与本声明的含义相同:

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;

演绎指南对我来说是新的,我将不得不消化你的答案一段时间你不是说模板结构通过而不是测试@PavloMuratov这是主要模板。我们声明一个专门化,它只接受Pass的专门化,以推断底层包T和U。@PavloMuratov推断指南或多或少地替代了makeX模板函数,该模板函数仅用于推断模板参数。通过要求测试总是通过makeTest函数模板创建的,该模板推导出它所传递的测试对象的模板参数,并为它所创建的测试显式指定这些参数,您可以编写此代码,而无需使用演绎指南或C++17。@PavloMuratov这个答案的核心是,您需要从Pass开始进行类型演绎。。。到两个列表T1…,T2。。。这就是你想要的。通过CTAD/构造函数形成的重载集或通过使用简单的makeTest函数模板的函数提供了此演绎上下文。您不能指定测试的模板参数应该在主模板签名中通过,您需要对此进行专门化。其余的在答案中解释。演绎指南对我来说是新的,我将不得不消化你的答案一段时间。你不是说模板结构通过而不是测试@PavloMuratov这是主要模板。我们声明一个专门化,它只接受Pass的专门化,以推断底层包T和U。@PavloMuratov推断指南或多或少地替代了makeX模板函数,该模板函数仅用于推断模板参数。通过要求测试总是通过makeTest函数模板创建的,该模板推导出它所传递的测试对象的模板参数,并为它所创建的测试显式指定这些参数,您可以编写此代码,而无需使用演绎指南或C++17。@PavloMuratov这个答案的核心是,您需要从Pass开始进行类型演绎。。。到两个列表T1…,T2。。。这就是你想要的。通过CTAD/构造函数形成的重载集或通过使用简单的makeTest函数模板的函数提供了此演绎上下文。您不能指定测试的模板参数应该在主模板签名中通过,您需要对此进行专门化。其余部分在答案中解释。