有没有办法在 C++ 中将 auto 作为参数传递?
Is there a way to pass auto as an argument in C++?
有没有办法将 auto 作为参数传递给另一个函数?
int function(auto data)
{
//DOES something
}
模板是您使用普通函数执行此操作的方式:
template <typename T>
int function(T data)
{
//DOES something
}
或者,您可以使用 lambda:
auto function = [] (auto data) { /*DOES something*/ };
如果您希望这意味着您可以将任何类型传递给函数,请将其设为模板:
template <typename T> int function(T data);
有人提议 C++17 允许使用您使用的语法(因为 C++14 已经为通用 lambda 做了),但它还不是标准。
编辑:C++ 2020 现在支持自动函数参数。请参阅下面阿米尔的回答
我不知道它什么时候变了,但目前问题的语法可以用 c++14:
https://coliru.stacked-crooked.com/a/93ab03e88f745b6c
只有警告:
g++ -std=c++14 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp:5:15: warning: use of 'auto' in parameter declaration only available with -fconcepts
void function(auto data)
使用 c++11 时出现错误:
main.cpp:5:15: error: use of 'auto' in parameter declaration only available with -std=c++14 or -std=gnu++14
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 Placeholder type specifiers [dcl.spec.auto]
placeholder-type-specifier:
type-constraintopt auto
type-constraintopt decltype ( auto )
A placeholder-type-specifier designates a
placeholder type that will be replaced later by deduction from an
initializer.
A placeholder-type-specifier of the form
type-constraintopt auto can be used in the decl-specifier-seq of a
parameter-declaration of a function declaration or lambda-expression
and signifies that the function is an abbreviated function template
(9.3.3.5) ...
有没有办法将 auto 作为参数传递给另一个函数?
int function(auto data)
{
//DOES something
}
模板是您使用普通函数执行此操作的方式:
template <typename T>
int function(T data)
{
//DOES something
}
或者,您可以使用 lambda:
auto function = [] (auto data) { /*DOES something*/ };
如果您希望这意味着您可以将任何类型传递给函数,请将其设为模板:
template <typename T> int function(T data);
有人提议 C++17 允许使用您使用的语法(因为 C++14 已经为通用 lambda 做了),但它还不是标准。
编辑:C++ 2020 现在支持自动函数参数。请参阅下面阿米尔的回答
我不知道它什么时候变了,但目前问题的语法可以用 c++14:
https://coliru.stacked-crooked.com/a/93ab03e88f745b6c
只有警告:
g++ -std=c++14 -Wall -pedantic -pthread main.cpp && ./a.out main.cpp:5:15: warning: use of 'auto' in parameter declaration only available with -fconcepts void function(auto data)
使用 c++11 时出现错误:
main.cpp:5:15: error: use of 'auto' in parameter declaration only available with -std=c++14 or -std=gnu++14
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 Placeholder type specifiers [dcl.spec.auto]
placeholder-type-specifier:
type-constraintopt auto
type-constraintopt decltype ( auto )
A placeholder-type-specifier designates a placeholder type that will be replaced later by deduction from an initializer.
A placeholder-type-specifier of the form type-constraintopt auto can be used in the decl-specifier-seq of a parameter-declaration of a function declaration or lambda-expression and signifies that the function is an abbreviated function template (9.3.3.5) ...