gpt4 book ai didi

c++ - 如何编写完美的缩写功能模板?

转载 作者:行者123 更新时间:2023-12-02 09:48:33 27 4
gpt4 key购买 nike

编写缩写功能模板的最佳实践是什么?
我了解,自C++ 20起,以下是有效的代码:

void f(auto&& val) {...}
使用decltype(auto)作为此类函数的返回类型是否必要?
特别是,以下代码是编写缩写功能模板的正确方法吗?
decltype(auto) f(auto&& val) {return std::forward<decltype(val)>(val+=2);}
  • 我应如何专门研究上述功能?
  • //something like this?: 
    template<> decltype(auto) f<MyClass>(MyClass& val) {...}

    最佳答案

    Is it essential to use decltype(auto) as the return type of such functions?


    取决于您要返回的内容。在这方面,使用缩写模板不会改变任何内容。

    In particular, is the following code the right way to write abbreviated function templates?

    decltype(auto) f(auto&& val) {return std::forward<decltype(val)>(val+=2);}
    decltype(auto)正确使用。但是,在处理 val之前,应先将其转发:
    std::forward<decltype(val)>(val) += 2;
    或者,您可以编写:
    decltype(val)(val) += 2;

    How should I specialize the above function?

    //something like this?: 
    template<> decltype(auto) f<MyClass>(MyClass& val) {...}

    该参数的类型为 T &&,其中 T是隐式模板参数。因此它必须是 f<MyClass>(MyClass&& val)f<MyClass &>(MyClass& val)。您也可以省略template参数,然后让编译器进行推断。
    但是请注意,这种特化仅适用于非常量,右值(或左值) MyClass参数。如果要专门处理所有值类别和参数的cv-qualifer组合,则需要重载它(因为您不能部分专门化函数):
    template <typename T>
    requires std::same_as<int, std::remove_cvref_t<T>>
    decltype(auto) f(T&& val) {return 42;}
    要么:
    decltype(auto) f(auto&& val)
    requires std::same_as<int, std::remove_cvref_t<decltype(val)>>
    {return 42;}

    关于c++ - 如何编写完美的缩写功能模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62653537/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com