在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中有没有更好的方法来做到这一点?
发布于 2017-01-13 18:04:04
在C++11中有没有更好的方法来做到这一点?
正则函数的返回类型不能在C++14之前推导,而lambda的返回类型可以。而非捕获的lambda的行为更像一个函数。因此,在C++11中,您可以这样做
auto MakeObject = [](const MyTypeA& obj) {
return std::make_tuple(obj._vec);
}但是,这不允许使用重载。如果你需要重载,那么尾随的decltype可能是一个更好的选择。
发布于 2017-01-13 22:11:52
#define RETURNS(...) decltype(__VA_ARGS__) { return __VA_ARGS__; }然后你就会得到
auto MakeObject(const MyTypeA& obj)
->RETURNS(std::make_tuple(obj._vec))这可能被认为是更好的,也可能不是。但它确实删除了干违例。
https://stackoverflow.com/questions/41628944
复制相似问题