2017-01-13 22 views
2

自動控除は、C++ 14で可能ですが、私は私がした場合にC++ 11すなわちdecltype(オート) - 戻り値の型の推論戻り値の型

でも似たような記述しようとしています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であると私は

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で同様のMakeObject何かを書き換えることができるだろう私は大量の過負荷の非会員機能を持っているのを見てくださいns。これは動作しますが、非常に冗長で冗長なコードのようです。 C++ 11でこれを行うより良い方法はありますか?

+3

あなたはラムダについて言及していますが、あなたの質問には1つのラムダは見えません。あなたは代わりに "後のリターンタイプ"を意味しましたか? – Angew

+3

私はあなたがラムダについて何を言うか分かりません。投稿したコードはラムダ関数を使用していません。 lambdas(名前付き関数を持たない)が十分であれば、C++ 11でreturn文が1つだけの場合は、すでに自動的な戻り型の減算が行われているので、簡単に使用できます。 –

+0

申し訳ありません。私の悪い、私は非ラムダコードを貼り付け、テキストを変更するのを忘れました。ラムダ – blueskin

答えて

1

これをC++ 11で行うより良い方法はありますか?

通常の関数の戻り値の型は、C++ 14より前に推測することはできませんが、lambdaの戻り値の型はできます。そして非捕捉ラムダは関数のように振る舞います。したがって、C++ 11では可能です

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

ただし、これはあなたが使用するオーバーロードを考慮していません。オーバーロードが必要な場合は、後続のdecltypeを使用する方が良いでしょう。

+0

を正確に使用していないので、ラムダをオーバーロードできません。それを行う方法があるかどうかわからない – blueskin

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

は、その後、あなたは

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

取得これは、またはより良いと考えてもしなくてもよいです。しかし、DRY違反は取り除かれます。