有没有办法在 C++ 中将 auto 作为参数传递?
Posted
技术标签:
【中文标题】有没有办法在 C++ 中将 auto 作为参数传递?【英文标题】:Is there a way to pass auto as an argument in C++? 【发布时间】:2015-07-08 19:30:31 【问题描述】:有没有办法将 auto 作为参数传递给另一个函数?
int function(auto data)
//DOES something
【问题讨论】:
取决于您期望它能够做什么。您需要什么功能模板不提供的功能? 这是一个可怕的想法。参数类型不仅适合您,还可以让其他人知道您的函数想要什么类型。只需花 3 秒写类型,不要那么懒惰(如果类型不固定,则使用模板)。 是的,使用 C++1z 概念,您可以做到这一点 :) @Synxis 这并不总是一个可怕的想法。如果类型足够复杂,则将其替换为auto
可能更易读(假设变量名有意义)。另外,我认为void f(auto t);
比template<typename T> void f(T t);
更具可读性,假设T
在f
中没有明确要求。
@pasbi assuming a meaningful variable name
这听起来像字符串输入,希望最好(实际上,你总是会被欺骗)。我也更喜欢较长的形式,因为它对模板更明确;也许有一天我会改变,但只有在有了概念之后!
【参考方案1】:
如果您希望这意味着您可以将任何类型传递给函数,请将其设为模板:
template <typename T> int function(T data);
有一个 C++17 提议允许您使用您使用的语法(正如 C++14 已经对通用 lambda 所做的那样),但它还不是标准的。
编辑:C++ 2020 现在支持自动函数参数。请参阅下面的 Amir 的回答
【讨论】:
我想知道:是不是一回事?也就是说,对于每个T
,都会有一个function<T>
,而对于auto
,只有一个,因为它的扣除发生了变化。还是我错了?
@black:这只是写同一件事的一种更短的方式。将为auto
推导出的每个参数类型实例化不同的函数,就像命名模板参数一样。
我认为隐式模板参数应该受到概念的约束......现在概念完全死了,还是 auto
用于不受约束的参数和(有一天)用于受约束的概念?
@BenVoigt:我不知道,我的超自然力量不足以知道 C++17 最终会是什么样子。概念当然没有死,而且很可能会以那个标准结束。但是否允许不受约束的auto
函数参数与它们有些正交。
@BenVoigt 是的,就是这个想法。 Concepts Lite 引入了auto
参数作为无约束参数的简写,并引入了受约束参数的概念。【参考方案2】:
C++20 允许auto
作为函数参数类型
此代码使用 C++20 有效:
int function(auto data)
// do something, there is no constraint on data
作为abbreviated function template。
这是非约束类型约束的特例(即无约束自动参数)。 使用概念,约束类型约束版本(即约束自动参数)将是例如:
void function(const Sortable auto& data)
// do something that requires data to be Sortable
// assuming there is a concept named Sortable
规范中的措辞,在我朋友Yehezkel Bernat的帮助下:
9.2.8.5 占位符类型说明符 [dcl.spec.auto]
占位符类型说明符:
类型约束opt自动
类型约束opt decltype ( auto )
占位符类型说明符指定一个 占位符类型,稍后将通过从 初始化器。
表单的占位符类型说明符 type-constraintopt auto 可用于 a 的 decl-specifier-seq 函数声明或 lambda 表达式的参数声明 并表示该函数是一个缩写的函数模板 (9.3.3.5) ...
【讨论】:
【参考方案3】:模板是您使用普通函数执行此操作的方式:
template <typename T>
int function(T data)
//DOES something
或者,您可以使用 lambda:
auto function = [] (auto data) /*DOES something*/ ;
【讨论】:
通用 lambda 是 C++14 的一个特性。【参考方案4】:我不知道它是什么时候改变的,但目前来自 Question 的语法在 c++14 中是可能的:
https://coliru.stacked-crooked.com/a/93ab03e88f745b6c
只有警告:
g++ -std=c++14 -Wall -pedantic -pthread main.cpp && ./a.out main.cpp:5:15:警告:在参数声明中使用“auto”仅适用于 -fconcepts 无效函数(自动数据)
用c++11有错误:
main.cpp:5:15: 错误:在参数声明中使用 'auto' 仅适用于 -std=c++14 或 -std=gnu++14
【讨论】:
如您所见,这是特定于 gcc 的扩展,它只能与 Concepts TS 一起使用。使用标准中的 C++20 概念,这将成为标准功能以上是关于有没有办法在 C++ 中将 auto 作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章