在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中有更好的方法吗?
答案 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违规行为。