模板推导指南中的附加类型

Additional type in template deduction guide

此代码段演示了如何使用推导指南来允许 source_location::current 与参数包(请参阅 ):

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");

现在我想通过一个额外的 Type T 来扩展 struct Test ,它应该明确指定。我尝试了以下但推导指南不被接受:

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...>;

编译器说:

deduction guide template contains a template parameter that cannot be deduced.

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

应该这样使用:

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

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

你不能用这种语法来做:

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

因为没有"partial" class模板参数推导。全有或全无 - 您可以指定 all class 模板参数或 none class模板参数。

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

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>参数。