2017-01-13 55 views
2
返回类型

自动扣除,可以在C++ 14,但我试图写一些类似C++ 11即decltype(自动)在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中有更好的方法吗?

+3

您提到了lambda,但我在您的问题中看不到一个lambda。你的意思是“追溯返回类型”吗? – Angew

+3

我不太明白你对lambdas的看法。您发布的代码不使用任何lambda函数。如果lambdas(没有命名函数)对您来说已经足够,您可以轻松使用它们,因为如果在C++ 11中只有一个返回语句,它们已经具有自动返回类型推演。 –

+0

对不起。我的坏,我粘贴非lambda代码,忘记改变文本。我完全没有使用lambda – blueskin

回答

1

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

虽然在C++ 14之前无法推导出正则函数的返回类型,但lambda的返回类型可以。非捕获的lambda表现得像一个函数。因此,在C++ 11中你可以做

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

但是,这不允许超载,你使用。如果你需要重载,那么后面的decltype可能是更好的选择。

+0

,我不能重载lambda表达式。不知道是否有办法做到这一点 – blueskin

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

然后你得到

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

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