3

私の問題に対する答えが見つからなかったので、質問として投稿します。それを説明するために、小さなダミーの例を作成します。

enum STORAGE_TYPE
{
    CONTIGUOUS,
    NON_CONTIGUOUS
};

template <typename T, STORAGE_TYPE type=CONTIGUOUS>
class Data
{
    public:
        void a() { return 1; }
};

// partial type specialization
template <typename T>
class Data<T, NON_CONTIGUOUS>
{
    public:
        void b() { return 0; }
};

// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
    /* How could I determine statically the STORAGE_TYPE? */
    #if .. ?? 
        d.a();
    #else
        d.b();
    #endif      
}


int main()
{
    Data<int> d1;
    Data<int, NON_CONTIGUOUS> d2;

    func(d1);
    func(d2);

    return 0;
}

(1)「func」の特殊化は必要ありませんが、コードを実行するための内部静的「if」条件を持つ1つのジェネリックメソッド「func」が必要なだけです。 (2)そして、標準の C++ (C++0x や boost ではなく) を使用したソリューションを好みます。

4

2 に答える 2

5

特性テクニックを使用します:

template <typename T, STORAGE_TYPE type>
struct DataTraits {
  static void callFunction(Data<T, type> &d)
  {
    d.a();
  }
};

template <typename T>
struct DataTraits<T,NON_CONTIGUOUS> {
  static void callFunction(Data<T, NON_CONTIGUOUS> &d)
  {
    d.b();
  }
};


// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
    /* How could I determine statically the STORAGE_TYPE? */
    DataTraits<T,type>::callFunction(d);
}
于 2012-10-04T07:52:30.430 に答える
0

キーはSFinaeです。ストレージ型でテンプレート化されたヘルパー クラスを宣言し、2 つのうちの 1 つに定義定義を提供する必要があります。このようにして、特殊化が存在する場合、コンパイル時にどのストレージタイプを使用しているか (定義を提供したもの) を認識し、置換が失敗した場合 (エラーではなく、SFINAE) は別のケースになります。

于 2012-10-04T07:51:45.740 に答える