gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:14:05 25 4
gpt4 key购买 nike

此片段演示了如何使用推导指南来允许 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");

现在我想通过一个额外的 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");

因为没有所谓的“部分”类模板参数推导。全有或全无 - 您要么指定所有类模板参数,要么指定类模板参数。

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

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>先论据。

关于c++ - 模板推导指南中的附加类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58492439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com