模板推导指南中的其他类型

时间:2019-10-21 18:47:48

标签: c++ c++17 template-argument-deduction

此代码段演示了如何使用推导指南将source_location::current与参数包一起使用(请参见https://stackoverflow.com/a/57548488/1421332):

template <typename... Params>
struct Test
{
   Test(Params&&... params,
        const std::source_location& loc = std::source_location::current());
};

template <typename ...Params>
Test(Params&&...) -> Test<Params...>;

这样使用:

Test(5, 'A', 3.14f, "foo");

现在,我想将结构测试扩展一个附加的类型T,该类型必须显式指定。我尝试了以下操作,但不接受推导指南:

template <typename T, typename... Params>
struct Test
{
    Test(Params&&... params,
         const std::source_location& loc = std::source_location::current());
};

template <typename T, typename ...Params>
Test(Params&&...) -> Test<T, Params...>;

编译器说:

  

推导指南模板包含不能为   推导。

我需要附加的T,以允许struct Test在内部构建用户指定类型的对象。

应这样使用:

Test<MyType>(5, 'A', 3.14f, "foo");

是否可以定义包括附加T的推导指南?

1 个答案:

答案 0 :(得分:3)

您不能使用以下语法:

Test<MyType>(5, 'A', 3.14f, "foo");

因为没有“部分”类模板参数推导之类的东西。它是全部还是什么都没有-您可以指定 all 类模板参数,也可以指定类模板参数。

但是,您可以将类型移到上方:

template <typename T> struct type_t {};
template <typename T> inline type_t<T> type{};

Test(type<MyType>, 5, 'A', 3.14f, "foo");

现在您推断出类型。您甚至可以编写演绎指南以要求使用此方法:

template <typename T, typename ...Params>
Test(type_t<T>, Params&&...) -> Test<T, Params...>;

尽管Test的构造函数仍需要首先接受type_t<T>参数。