如果对 ( , ) 有效,我需要一个给定类型T1
并T2
产生第三种类型的机制,否则产生一个特殊类型。T3
T1
T2
Null
我目前定义T1
为一个类,在其中我可以将有效的选项集映射T2
到适当的T3
.
我正在寻找一种语法,使得有效的集合T2
可以在T1
. 这是解决问题的一种方法,使用重载解析:
#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)
};