2017-05-16 8 views
0

私はコード内のさまざまなモジュールに複数のデータクラスを持っていますが、変更するつもりはありません。 私は、それぞれのコンテナクラスを持っています。コンテナクラスは、このデータクラスへのポインタを持っています。また、これらのクラスを知ることなく保持するクラスへのポインタもあります。私が実装コンテナクラスでそうテンプレートの自動返却型

DataClass GetMyData (void){ 
    return myData; 
} 

と私は

template<class ContainerClass> 
ContainerClass GetContainer (void); 

template<class ContainerClass> 
auto GetData (void){ 
    GetContainer<ContainerClass>().GetMyData(); 
} 

を作成しましたが、私はこのGetDataの機能を使用しようとするたびに、私はエラーを取得するこれらのcointainerクラスのコレクションでの

'auto'を返す関数は、定義される前に使用できません。

私の質問は、この場合(C++ 11)autoを使用することは可能ですか、2つのクラスでテンプレートを作成する必要がありますか?

+3

C++ 11では、これは全く可能ではありません。戻り値の型減算はそこのlambdasにのみ適用されます。関数用にも追加したのはC++ 14でした。 – Angew

+0

ありがとうございましたAngew、よく私は別のテンプレートパラメータを使用しなければならないと思います... –

+1

@MartinZink - あなたはありません – StoryTeller

答えて

4

あなたはGetData()returnを忘れてしまった場合、autoを動作しないことができるテンプレートの種類(感謝Jarod42!)のgetData()によって返された同じ型を返すために役に立たないです。

とにかく... C++で

struct A 
{ int getData() const { return 1; } }; 

struct B 
{ std::string getData() const { return "abc"; } }; 

を次のように構造体のカップル与えられた14 GetData()

template <class CC> 
auto GetData() 
{ return CC{}.getData(); } 

として簡単に書き込むことができますが、これはCで動作しません。++ 11; C++ 11であなたは、C++ 11の前に

template <class CC> 
auto GetData() -> decltype(CC{}.getData()) 
{ return CC{}.getData(); } 

を書くことができauto(この使用は)ありません。落語で指摘したように

--- EDIT ---

decltype(CC{}.getData())の使用はタイプCCがデフォルト構築可能であることを前提としています。

私が書いたおもちゃの例では、機能の本体にCC{}を使用しているため、これは問題ではありません。

単純なケースでは、関数の本体で何が返されるかをdecltype()式で反映することができます。例であなたがタイプCCのオブジェクトを渡す場合、あなたは

template <class CC> 
auto GetData (CC const & cc) -> decltype(cc.getData()) 
{ return cc.getData(); } 

を書くことができます。しかし、これまでそれほど単純ではありません。そこには、返された値が与えられた表現であることを知っているときのケースがありますが、機能が複雑にありますdecltype()の式でミラーリングします。

したがって、構造的/非構造的な問題を回避するには、それを使用することをおすすめします(StoryTellerのおかげで、感謝します)std::declval;例:

template <class CC> 
auto GetData() -> decltype(std::declval<CC>().getData()) 
{ /* something complicated ... */ return something.getData(); } 
+0

を使用してコンパイルした場合、 'auto'は' void'になります。 – Jarod42

+0

@ Jarod42 - あなたは正しい。この点を修正するために私の答えを修正しました。ありがとう。 – max66

+1

一般的に 'std :: declval'を使う方が良いです。なぜクラスはデフォルトで構成可能でなければならないのですか? – StoryTeller

関連する問題