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

时间:2017-01-13 06:52:37

标签: 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中有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

  

在C ++ 11中有更好的方法吗?

虽然在C ++ 14之前无法推断出常规函数的返回类型,但lambda的返回类型可以。并且非捕获lambda的行为很像函数。所以,在C ++ 11中你可以做到

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

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

答案 1 :(得分:0)

#define RETURNS(...) decltype(__VA_ARGS__) { return __VA_ARGS__; }

然后你得到

auto MakeObject(const MyTypeA& obj)
->RETURNS(std::make_tuple(obj._vec))

这可能会或可能不会被认为更好。但它确实消除了DRY违规行为。

相关问题