8

1 対 1 の関係に関連する一連の型があります。たとえば、次のようになります。

TypeA ---> Type1
TypeB ---> Type2 
TypeC ---> Type3

私はコンパイル時にこれらの関係を知っています。

次に、この 2 つの型に依存するテンプレート クラスがあります。

template<class T1,class T2>
class MyClass
{
  T1 foo;
  T2 bar;
};

さて、私のライブラリのユーザーは次のように入力します:

MyClass<TypeA,Type1> x;

2 つの型の間に依存関係があり、ユーザーが最初の型のみを指定するだけで十分であるため、これは不便です。

また、2 つのタイプを混在させることはできません。

MyClass<TypeA,Type2> y; //it should not compile

私はテンプレート メタ プログラミングにあまり詳しくありません。これは実行可能なタスクであるという印象を受けましたが、間違っている可能性があります。

関連する型の数は膨大ですが、必要に応じてスクリプトを実行してコードを生成できます。

それが可能か、それとも私が時間を無駄にしているのか知っていますか? 私を正しい方向に向けるアイデアはありますか?

4

3 に答える 3

8
template<class T>
struct get_mapped;

template<>
struct get_mapped<TypeA>{
    typedef Type1 type;
};

// and so on....


template<class T>
class MyClass{
    typedef typename get_mapped<T>::type T2;

    T foo;
    T2 bar;
};
于 2011-10-12T12:16:59.107 に答える
5
template<class T> struct TypeLetter2TypeDigit;

template<> struct TypeLetter2TypeDigit<TypeA> { typedef Type1 type; };
template<> struct TypeLetter2TypeDigit<TypeB> { typedef Type2 type; };
template<> struct TypeLetter2TypeDigit<TypeC> { typedef Type3 type; };


template<class T1>  // Type2 is not needed
class MyClass 
{ 
  // Type2 is deduced.
  typedef typename TypeLetter2TypeDigit<T1>::type T2;
  T1 foo; 
  T2 bar; 
}; 
于 2011-10-12T12:16:13.943 に答える
3

ラッパータイプを作成するだけではどうですか:

template <typename T1, typename T2>
struct wrapper
{
   typedef T1 type1;
   typedef T2 type2;
};

typedef wrapper<TypeA, Type1> TypeX;
typedef wrapper<TypeB, Type2> TypeY;
typedef wrapper<TypeC, Type3> TypeZ;

次に、ユーザーが と言うと、MyClass<TypeX>;次のように定義します。

template <typename T>
class MyClass
{
  typename T::type1 foo;
  typename T::type2 bar;
};

テンプレートの誤用を防ぎたい場合は、部分的な特殊化を使用してください。

template <typename> class MyClass; // undefined

template <typename S, typename T>
class MyClass<wrapper<S,T>>
{
  S foo;
  T bar;
};

このアプローチは、簡単に拡張して、さらにコンパイル時のデータをラッパー クラスに含めることができます。std::pairまたは、代わりにメンバー型first_typeandを使用することもできますsecond_type

于 2011-10-12T12:15:27.077 に答える