Is there a way to pass auto as an argument in C++?
C++20 allows auto
as function parameter type
This code is valid using C++20:
int function(auto data) {
// do something, there is no constraint on data
}
As an abbreviated function template.
This is a special case of a non constraining type-constraint (i.e. unconstrained auto parameter). Using concepts, the constraining type-constraint version (i.e. constrained auto parameter) would be for example:
void function(const Sortable auto& data) {
// do something that requires data to be Sortable
// assuming there is a concept named Sortable
}
The wording in the spec, with the help of my friend 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) ...
If you want that to mean that you can pass any type to the function, make it a template:
template <typename T> int function(T data);
There's a proposal for C++17 to allow the syntax you used (as C++14 already does for generic lambdas), but it's not standard yet.
Edit: C++ 2020 now supports auto function parameters. See Amir's answer below