有没有办法在 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 )

  1. A placeholder-type-specifier designates a placeholder type that will be replaced later by deduction from an initializer.

  2. 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) ...