4

型を指定し、ペア ( , ) が有効な場合は3 番目の型を生成し、そうでない場合は特別な型T1を生成するメカニズムが必要です。T2T3T1T2Null

T1私は現在、有効なオプションのセットをT2適切なにマップできるクラスとして定義していますT3

T2の定義内で有効なセットをインラインで定義できるような構文を探していますT1。これは、オーバーロード解決を使用して問題を解決する 1 つの方法です。

#include <utility>

struct X {};    
struct Y {};
struct A {};
struct B {};
struct C {};

struct S // T1
{
    X member(A) { return X(); } // T2=A, T3=X
    Y member(B) { return Y(); } // T2=B, T3=Y
};

struct Null
{
};

template<typename T, typename Arg>
decltype(std::declval<T>().member(std::declval<Arg>()))
    call_member(T& t, Arg arg)
{
    return t.member(arg);
}

template<typename T>
Null call_member(T& t,...)
{
    return Null();
}

int main()
{
    S s;
    X x = call_member(s, A()); // calls S::member(A)
    Y y = call_member(s, B()); // calls S::member(B)
    Null null = call_member(s, C());
}

T2問題は、が見つからないケースを処理することです。これはcall_member、上記の例で処理されます。を定義する必要がないようにしていますNull S::member(...)

この例では を使用decltypeしていますが、C++03 でこれを行う方法はありますか? 私はあらゆる代替実装を受け入れます (できれば C++03 に適しています)。

明示的な特殊化を使用してそのようなメカニズムを実装することも可能ですが、次のように表現できるように、例と同じ構文構造を保持するメソッドを探しています。

#define MEMBER(T2, T3) /* implementation details */

struct S : Base // base-class may contain helper code
{
    MEMBER(A, X)
    MEMBER(B, Y)
};
4

2 に答える 2

1

構造内でテンプレート クラスを使用する可能性がありますS。次に、必要に応じてこのクラスを特殊化できます。

struct Null {};

struct S
{
  template<typename> struct map { typedef Null type; };
};

template<> struct S::map<int> { typedef char type; };

template<> struct S::map<char> { typedef int type; };

int main()
{
  std::cout << typeid(S::map<int>::type).name() << std::endl;  // c
  std::cout << typeid(S::map<char>::type).name() << std::endl; // i
  std::cout << typeid(S::map<S>::type).name() << std::endl;    // 4Null
}

それを定義するための構文は、あなたが望んでいたとおりではありません (クラスの外部で特殊化を宣言する必要があり、基本クラスで初期マッピングを除外することはできないと思いますNull) が、少なくとも単純C++03 です。互換性。ただし、いくつかのマクロを使用すると、次のようなものをより使いやすくすることができます。

struct S { INITIALIZE_TYPES_MAP; };
ADD_MAPPED_TYPE(S, int, char);
ADD_MAPPED_TYPE(S, char, int);
//...
std::cout << typeid(GET_MAPPED_TYPE(S, int)).name() << std::endl;

これらのマクロは簡単に作成できるので、退屈することはありません。

于 2013-08-25T14:54:53.607 に答える