c++ - C++11 中的 decltype(auto) - 推导返回类型

标签 c++ c++11 c++14 auto decltype

在 C++14 中可以自动推导返回类型,但我正在尝试在 C++11 中编写类似的东西,即

如果我用 C++14 来写,那就是

struct MyTypeA{
    std::vector<int> _d;
};

struct MyTypeB{
    int _id;
    std::string _name;
    MyTypeA _data;
};

decltype(auto) MakeObject(const MyTypeA& obj) {
    return std::make_tuple(obj._vec);
}

decltype(auto) MakeObject(const MyTypeB& obj) {
    return std::make_tuple(obj._id, obj._name, std::make_tuple(MakeObject(obj._data)));
}

上面是 C++14,我可以在 C++11 中重写 MakeObject 类似的东西,如下所示,

auto MakeObject (const MyTypeA& obj) -> decltype( std::make_tuple(obj._d)){
    return std::make_tuple(obj._d);
};

auto MakeObject (const MyTypeB& obj) -> decltype( std::make_tuple(obj._id, obj._name, std::make_tuple(MakeObject(obj._data)))){
    return std::make_tuple(obj._id, obj._name, std::make_tuple(MakeObject(obj._data)));
};

如您所见,我有一堆重载的非成员函数。虽然这有效,但它看起来非常冗长和冗余的代码。在 C++11 中有没有更好的方法来做到这一点?

最佳答案

Is there a better way to do this in C++11?

虽然在 C++14 之前无法推导常规函数的返回类型,但 lambda 的返回类型可以。非捕获 lambda 的行为很像一个函数。所以,在 C++11 中你可以这样做

auto MakeObject = [](const MyTypeA& obj) {
     return std::make_tuple(obj._vec);
}

但是,这不允许您使用重载。如果您需要重载,那么尾随的 decltype 可能是更好的选择。

关于c++ - C++11 中的 decltype(auto) - 推导返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41628944/

相关文章:

c++ - 游戏开发逻辑(获取区域单位)

c++ - imap:从 C++ 程序发送电子邮件时为 "Unable to create selectable TCP socket"

c++ - 使用 std::move 和 std::shared_ptr 有什么好处和风险(如果有的话)

c++ - 整理私有(private)函数的元编程技巧

c++11 - 实现自定义迭代器以与std::sort一起使用

c++ - 复制具有多态内容的 std::unique_ptr 的 std::map

c++ - 视觉口齿不清 : how to call functions in external C++ DLL

c++ - 通过检查输入字节确定输入编码

c++ - 在构造函数中使用 constexpr 成员

文件的 C++ OpenSSL 哈希值不正确