2011-03-12 11 views
2
template <typename E> 
class VecExpression{ 

public: 

    operator E&(){ 
    return static_cast<E&>(*this); 
    } 
    operator E const&() const{ 
    return static_cast<const E&>(*this); 
    } 
}; 

このコードを教えていただけますか?このような演算子のオーバーロードは見たことがありません。戻り値の型は何ですか?パラメータはありますか?使用状況や、どこで呼び出されているのかを確認できますか?C++式テンプレート:operator what?

出典:http://en.wikipedia.org/wiki/Expression_templates

答えて

3

これは、変換演算子です。オペレータは、クラスのテンプレートタイプEへのconstまたは非const参照を返すされるように::オペレータINT()を

+0

このコード例は本当に助かりました。どうもありがとう。 – Arlen

+1

*明示的なキャストは必要ありません。 – Nawaz

+1

C + +では正に、Cスタイルのキャストは_bad_といたずらです。 'static_cast (a)'を実行してください。そうでない場合は暗黙の変換に依存します。 –

5

VecExpression呼び出すだろう

int i = (int)a; 

テンプレートです。暗黙の変換演算子です。パラメータを必要とせず、ただVecExpression<E>を使用し、Eが必要なコンテキストで使用することができます。

+0

ありがとうございます。 – Arlen

3

キャスト演算子と考えることができます。

キャストVecExpressionをタイプEのオブジェクト(またはタイプEのオブジェクトへの参照)に定義しています。基本的にこれは、型Eのオブジェクトを取る関数にVecExpression型のオブジェクトを渡すことを許可し、コンパイラはこの演算子を使って自動的に変換します。

int stuff(int x) 
{ 
    return x + 1; 
} 

int code() 
{ 
    VecExpression<int> x; 
    return stuff(x); // cast x to E (which is an int). 
} 
+0

変換演算子。キャストされません。キャストは実行しませんが、暗黙の変換を実行します。 –

+0

@Tomalak Geret'kal:そういうわけで私は「あなたはそれを考えることができる」という言葉を使ったのです。ほとんどの状況と同様に、キャスト操作を使用するように見えます。はい、あなたは技術的に正しいですが、それは変換です。 –

+0

確かに、キャスト演算子と考えることはできますが、間違っているでしょう。間違った専門用語を知らない人には伝えませんか? –

関連する問題