Is there a way to pass auto as an argument in C++?

后端 未结 4 1385
星月不相逢
星月不相逢 2020-12-01 18:06

Is there a way to pass auto as an argument to another function?

int function(auto data)
{
    //DOES something
}
相关标签:
4条回答
  • 2020-12-01 18:07

    Templates are the way you do this with normal functions:

    template <typename T>
    int function(T data)
    {
        //DOES something
    }
    

    Alternatively, you could use a lambda:

    auto function = [] (auto data) { /*DOES something*/ };
    
    0 讨论(0)
  • 2020-12-01 18:17

    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

    0 讨论(0)
  • 2020-12-01 18:22

    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 )

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

    0 讨论(0)
  • 2020-12-01 18:31

    I dont know when it changed, but currently syntax from Question is possible with c++14:

    https://coliru.stacked-crooked.com/a/93ab03e88f745b6c

    There is only warning about it:

    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)

    With c++11 there is an error:

    main.cpp:5:15: error: use of 'auto' in parameter declaration only available with -std=c++14 or -std=gnu++14

    0 讨论(0)
提交回复
热议问题