2016-08-01 30 views
5

私は解決する方法がわからないという一見単純な質問があります。テンプレートオーバーロード(参照版と非参照版)

は、以下のテンプレート方式の特殊コンテナ(の一種)に何かを追加することができます

template<typename T> void Add(T& var); 

を想像してみてください。私は以上の複雑な型をstringsのように渡すことができます。そのため、Tを参照として渡しています。

これに伴う問題は、私のような他の方法の結果を追加しました。(...)呼び出したい時はいつでもということです:

Add(MethodThatReturnsAnInt()); 

これは動作しませんし、一時変数を保持するために必要とされていますMethodThatReturnsAnInt()の結果。

Addをオーバーロードする方法はありますか?そうすれば、参照渡しと参照渡しのバージョンを持つことができますか?

template<typename T> void Add(T& var); 
template<typename T> void Add(T var); 

std::enable_ifこのような状況で使用することはできますか?

+0

[rvalue references](http://en.cppreference.com/w/cpp/language/reference)についての情報をお読みください。 –

+0

Google _転送参照。あなたの状況と結果の質問は非常に共通していて、言語機能を追加しました。 ;-)これはC++ 11の基本的な機能であり、おそらく十分な時間が既に与えられています。 –

+0

あなたは実際にどのような問題を解決しようとしていますか? 'Add()'は何をするのですか? – Barry

答えて

6

あなたがC++ 11コンパイラを使用している場合、あなたは(Universal Reference)フォワーディング参照使用できます

template<typename T> void Add(T&& var) {} 

int MethodThatReturnsAnInt() { return 42; } 

int main() 
{ 
    int a = MethodThatReturnsAnInt(); 

    Add(a);      // lvalue passed: void Add(int& var) takes lvalue reference 
    Add(MethodThatReturnsAnInt()); // rvalue passed: void Add(int&& var) takes rvalue reference 
} 

T&&この例では右辺値参照ではありません。型推論の文脈では、T&&には特別な意味があります。次のようにTは機能Add()に渡された式に依存します。式は左辺値ある

  • 場合:タイプEの(例えばa)、そしてTはE&に推定されます。

  • 式が右辺値(例:関数によって返される値)であれば種類Eの、そしてTはEvarに推定されるには、タイプE&&を持つことになります。

+0

これは@SamVarshavchikが言ったこととどのように違うのですか(昔ながらの名前_universal reference_を使用している点を除いて)?また、この例題は何らかの形で間違っていて誤解を招きます。 – skypjack

+0

2番目の呼び出しは、実際には 'Add(int && var)'ではなく、 'Add(int var)'ではありません。 'int'でも同じですが、もっと複雑なクラスではありません。 – Holt

+2

@skypjack samの名前は、あなたがGoogleに使用して他の場所でヘルプを使用して問題を解決できる用語を削除しました。セルジはここで問題を解決する答えを掲示しました。 – Yakk

2

コンパイラがC++ 11をまだサポートしていない場合は、コンパイラを更新して、フォワーディングリファレンス&&を使用する必要があります。