此代码段演示了如何使用推导指南将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的推导指南?
答案 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>
参数。