首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用自动模板类型推导列出函数模板参数的初始化

使用自动模板类型推导列出函数模板参数的初始化
EN

Stack Overflow用户
提问于 2021-10-03 14:13:40
回答 1查看 54关注 0票数 0

下面是用来说明问题的设置。

代码语言:javascript
运行
复制
template <typename T>
struct opt {
  const char* name;
  T x;

  template <typename X>
  opt(const char* name, X&& x)
  : name(name), x(std::forward<X>(x)) { }
};

template <typename T>
opt(const char*, T&&) -> opt< some_type_transformation<T> >;

template <typename... T>
void function(opt<T>&&... opts) {
  // do something with the passed arguments
}

因此,可以使用以下语法。

代码语言:javascript
运行
复制
function(opt("a",1),opt("b",2.),opt("c",3u));

但以下方法不起作用。

代码语言:javascript
运行
复制
function({"a",1},{"b",2.},{"c",3u});

从理论上讲,有足够的信息来确定在第二种情况下要做什么,因为function只接受opt<T>类型的参数,并且可以使用定义的推导指南来推导T

可以做些什么来启用第二种更简洁的语法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-10-03 16:07:38

模板参数推导依赖于使用表达式的类型来匹配模板参数中定义的模式。

Copy-list-initialization (list-initialization,在使用带括号的init-list时,所用类型的名称不能立即使用的列表初始化)是一个过程,在该过程中,将值序列与命名类型的声明进行匹配,以确定要使用哪种初始化形式。也就是说,它涉及到一定程度的演绎。

您要做的是有效地进行双重演绎,因为带括号的init列表本身并没有定义良好的类型。您需要使用模板参数中的模式来匹配一组可能的类型及其构造函数与带括号的init-list的成员。

在模板参数推导的某些情况下,这样的事情在理论上是可能的,但确切地说出这些情况是非常困难的,因为模板参数推导的工作方式本身是相当复杂的。因此,该标准采取了一种简单的方法并完全禁止它:您不能在模板参数推导中涉及的参数上使用copy-list-initialization,句号。

所以没有更短的形式了。你只需要把它拼写出来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69425650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档