2012-02-13 9 views
2

関連:プリプロセッサディレクティブの#ifと非型テンプレートパラメータ

私はこれを行うことができますか?

template <int N> union Vector 
{ 
    float e[ N ] ; 
    // If N is 3, define x,y,z components 
    #if N==3 
    struct { float x,y,z ; } ; 
    #elif N==2 
    struct { float x,y ; } ; 
    #endif 
} ; 

// use 
int main() 
{ 
    Vector<2> xy ; 
    xy.e[ 0 ] = 5 ; 
    xy.e[ 1 ] = 2 ; 
    xy.x = 2 ; 

    Vector<3> xyz ; 
    xyz.z = 4 ; 
} 

答えて

6

テンプレートのインスタンス化が発生する前にマクロ置換が行われるため、この正確なコードは機能しません。換言すれば、コンパイラが実際に引数Nを用いてテンプレートをインスタンス化しようとする時までに、プリプロセッサは既に条件付き包含を行っている。さらに、プリプロセッサには、テンプレートが何であるか、あるいはNがテンプレート引数であるというセマンティックなアイデアはありません。単にNをプリプロセッサトークンとして扱います。

あなたはこの効果を取得したい場合は、テンプレートの特殊化を使用することができます。

template <int N> union Vector 
{ 
    float e[ N ] ; 
}; 

template <> union Vector<3> 
    float e[ 3 ] ; 
    float x, y, z; 
} ; 

template <> union Vector<2> 
    float e[ 2 ] ; 
    float x, y; 
} ; 

は、この情報がお役に立てば幸い!

+0

Livin '、そのユーザーIDまで、eh :) – bobobobo

5

いいえプロペラはテンプレートが評価される前に実行されます。テンプレート特殊化を代わりに使用してください。

template<int N> union Vector { 
    float e[N]; 
}; 

template<> union Vector<3> { 
    float e[3]; 
    struct { float x, y, z; }; 
}; 

// etc 
関連する問題