完美转发到数据成员的成员函数?

Vin*_*ent 3 c++ forwarding member auto c++14

考虑一个具有private std::vector数据成员的类:

class MyClass 
{
    private: 
        std::vector<double> _data;
    public:
        template <class... Args>
        /* something */ insert(Args&&... args) /* something */
        {
            return _data.insert(std::forward<Args>(args)...);
        }
};
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法(使用C++ 14自动/可变参数模板/前进...)传输的给定函数_dataMyClass(例如insert这里),并为用户提供相同的接口?

Rap*_*ptz 6

正确的语法是这样的:

class MyClass 
{
    private: 
        std::vector<double> _data;
    public:
        template <class... Args>
        decltype(auto) insert(Args&&... args)
        {
            return _data.insert(std::forward<Args>(args)...);
        }
};
Run Code Online (Sandbox Code Playgroud)

但是,实际上并不需要C++ 14来完成它.您可以使用C++ 11语法.

class MyClass 
{
    private: 
        std::vector<double> _data;
    public:
        template <class... Args>
        auto insert(Args&&... args) 
        -> decltype(_data.insert(std::forward<Args>(args)...))
        {
            return _data.insert(std::forward<Args>(args)...);
        }
};
Run Code Online (Sandbox Code Playgroud)

  • @JonathanWakely也许有一天我们会"noexcept(auto)":P (3认同)