2011-12-18 11 views
0

基本タイプまたはキャストに明示的な初期化を使用する以外に、コンストラクタのテンプレートクラスメンバーに値を割り当てる他の方法はありますか?リテラルを使用してテンプレートタイプに値を割り当てる

template <class T> 
struct A 
{ 
public: 
    T member; 

    A() :member(T()) // or :member(static_cast<T>(1.0f)) 
    {} 
}; 

私はコンストラクタでmemberに1.0の値を割り当てます。キャストせずにこれを行うことはできますか?

+1

あなたはどのようにすることなく、任意のTに '1.0'を割り当てることができますが鋳造?あなたはあるタイプから別のタイプへ進んでいます。それは定義によってキャストしています。 –

+0

@PeterAlexanderもしあなたがそれについて考えるなら、1.0fの代わりに1.0Tか何かがあるかもしれません。理論的にはキャストを避けることができます。 – xcrypt

+0

それは 'T'が何であるかによって異なります。プリミティブ積分型または浮動小数点型のみの場合、 '1'を使用すると、コンパイル時に正しい値として解釈されます。 –

答えて

2

はい、暗黙的に任意の数値型に変換することができ整数、使用:

template <class T> 
struct A 
{ 
public: 
    T member; 

    A() : member(1) 
    {} 
}; 

int main() 
{ 
    A<int> a1; 
    A<double> a2; 
    A<float> a3; 
    return 0; 
} 
+0

うーん、クールだけど、例えば1.5を割り当てたいのであれば?変換なしで可能ではないですか? (ofcはあらかじめコンパイルする必要がありますが、実行時にキャストを避けることがポイントです)。編集:待って、テンプレートは、プリコンパイルされませんか?うーん... – xcrypt

+0

あなたのプロジェクトでどのように使用するかによってコンパイルされても問題ありません。したがって、理論上は実行時に変換を避けることができます。 – xcrypt

+1

1.5を割り当てる場合は、明示的なキャストを使用する必要があります。これは、コンパイル時に質問に実装されたとおりに行われます。 – ronag

0

これの何が問題になっている:

A() :member(1) 
{} 
+0

Tがintまたはfloatの場合、警告を出さないでしょうか? – ronag

+0

@ronag:今、幸せですか? – Nawaz

関連する問題