模板推导指南中的附加类型
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>
参数。
此代码段演示了如何使用推导指南来允许 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>
参数。