【问题标题】:decltype(auto) in C++11 - deducing return typeC++11 中的 decltype(auto) - 推断返回类型
【发布时间】:2017-01-13 06:52:36
【问题描述】:

在 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 中有没有更好的方法来做到这一点?

【问题讨论】:

  • 您提到了 lambda,但我在您的问题中看不到一个 lambda。您的意思是“尾随返回类型”吗?
  • 我不太明白你对 lambdas 的看法。您发布的代码没有使用任何 lambda 函数。如果 lambdas(没有命名函数)对您来说足够了,您可以轻松使用它们,因为如果 c++11 中只有一个 return 语句,它们已经具有自动返回类型推导。
  • 对不起,伙计们。我的错,我粘贴了非 lambda 代码并忘记更改文本。我没有使用 lambda

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 没错,我不能重载 lambda。不确定是否有办法做到这一点
【解决方案2】:
#define RETURNS(...) decltype(__VA_ARGS__) { return __VA_ARGS__; }

然后你得到

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多