型を指定し、ペア ( , ) が有効な場合は3 番目の型を生成し、そうでない場合は特別な型T1
を生成するメカニズムが必要です。T2
T3
T1
T2
Null
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)
};