7

プリプロセッサディレクティブで非型定数テンプレートパラメータを使用することは可能ですか?これが私が心に留めていることです:

template <int DING>
struct Foo
{
    enum { DOO = DING };
};

template <typename T>
struct Blah
{
    void DoIt()
    {
        #if (T::DOO & 0x010)

        // some code here

        #endif
    }
};

のようなものでこれを試してみるとBlah<Foo<0xFFFF>>、VC ++ 2010は、使用しようとしている行の一致しない括弧について何か不平を言います#if。プリプロセッサはテンプレートについて何も知らないのではないかと思いますが、この種のことはそのドメインに含まれていません。何を言います?

4

3 に答える 3

11

いいえ、これは不可能です。プリプロセッサはかなり愚かで、プログラムの構造を認識していません。T::Dooがプリプロセッサで定義されていない場合(および のために定義できない場合::)、その式を評価できず、失敗します。

ただし、コンパイラに頼って賢いことを行うことができます。

        if (T::Doo & 0x010) {
            // some code here
        }

定数式とデッド ブランチは、最適化設定が低くても最適化されるため、ランタイム オーバーヘッドなしで安全に実行できます。

于 2010-05-25T12:11:31.907 に答える
2

T で使用できるメンバーは、どのビットが設定されているかによって異なります。T::DOO

サブクラス識別子のようT::DOOに振る舞っているように思えます。したがって、あなたと関連するクラスは、それが定義さFooれていることを保証するクラスのサブクラスでなければならないと考えています。DOO

重要なのは、なぜビット フィールドを使用する必要があるのか​​ということです。

于 2010-05-25T14:27:28.527 に答える
1

これがあなたの状況に当てはまるかどうかはわかりませんが、テンプレート クラスを使用してさまざまなケースを分離することは可能です。例: (上記のコードの修正版を使用)

template <typename T, int N>
struct Blah
{
    void DoIt()
    {
        // normal DoIt() code
    }
};

template <typename T>
struct Blah<T,5>
{
    void DoIt()
    {
        // special DoIt() code for only when N==5
    }
};
于 2010-09-03T07:43:59.963 に答える