首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11中的decltype(auto) -推导返回类型

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

Stack Overflow用户
提问于 2017-01-13 14:52:37
回答 2查看 1.3K关注 0票数 2

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

如果我要用C++14编写,它将是

代码语言:javascript
复制
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代码,如下所示

代码语言:javascript
复制
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中有没有更好的方法来做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2017-01-13 18:04:04

在C++11中有没有更好的方法来做到这一点?

正则函数的返回类型不能在C++14之前推导,而lambda的返回类型可以。而非捕获的lambda的行为更像一个函数。因此,在C++11中,您可以这样做

代码语言:javascript
复制
auto MakeObject = [](const MyTypeA& obj) {
     return std::make_tuple(obj._vec);
}

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

票数 1
EN

Stack Overflow用户

发布于 2017-01-13 22:11:52

代码语言:javascript
复制
#define RETURNS(...) decltype(__VA_ARGS__) { return __VA_ARGS__; }

然后你就会得到

代码语言:javascript
复制
auto MakeObject(const MyTypeA& obj)
->RETURNS(std::make_tuple(obj._vec))

这可能被认为是更好的,也可能不是。但它确实删除了干违例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41628944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档