有没有办法将auto作为参数传递给另一个函数?
int function(auto data)
{
//DOES something
}
auto
作为函数参数类型以下代码在C++20中是有效的:
int function(auto data) {
// do something, there is no constraint on data
}
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]
placeholder-type-specifier:
type-constraintopt auto
type-constraintopt decltype ( auto )
占位符类型说明符指定了一个占位符类型,该类型将在初始化程序中通过推导后被替换。
形如 type-constraintopt auto 的占位符类型说明符可以用于函数声明或 lambda 表达式的参数声明的 decl-specifier-seq 中,表示该函数是一个缩写的函数模板(9.3.3.5)...
-fconcepts
选项,也可以使用旧版本的标准(-std=c++14
或-std=c++17
)来实现相同的效果。 - s.yadegaritemplate <typename T> int function(T data);
有一个建议允许使用你所用的语法(就像C++14已经为通用lambda函数所做的那样),但它目前还不是标准。
C++ 2020现在支持自动函数参数。请参见Amir的答案。
T
都会有一个 function<T>
,而对于 auto
只有一个,因为它的推导是会改变的。或者我错了吗? - edmzauto
的参数类型,将实例化一个不同的函数,就像对于命名的模板参数一样。” - Mike Seymourauto
用于无限制的参数,而(某天)概念用于有限制的参数? - Ben Voigtauto
作为无约束参数的简写,并引入了概念来限制参数。 - Rapptzauto
被允许作为函数参数声明。这被称为“缩写函数模板”:https://en.cppreference.com/w/cpp/language/function_template#Abbreviated_function_template - xtofl模板是您使用普通函数完成此操作的方式:
template <typename T>
int function(T data)
{
//DOES something
}
另外,您可以使用lambda:
auto function = [] (auto data) { /*DOES something*/ };
我不知道什么时候改变了,但目前使用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可用 void function(auto data)
使用c++11会出现错误:
main.cpp:5:15: 错误:在参数声明中使用'auto'仅在-std=c++14或-std=gnu++14可用
auto
替换它可能更易读(假设有一个有意义的变量名)。此外,我认为void f(auto t);
比template<typename T> void f(T t);
更易读,假设f
内部没有明确要求使用T
。 - pasbi