我有课
template <typename T, typename W>
class A {
void foo(W);
void foo(T);
void foo(int);
}
当T=int
、W=int
或W=T
时,此类无法编译。我怎样才能让这些方法优先于彼此?
我想要优先级 W > T > int
。因此,如果 W=T
,则忽略 foo(T)
并调用 foo(W)
。如果 T=int
,则忽略 foo(int)
并调用 foo(T)
。
编译器是VS2012,但我也有Linux,也会考虑GCC/Clang方案。任何在任何主流编译器上编译的东西都可以,但前提是你说它适用于什么编译器。
最佳答案
我会标记 dispatch。覆盖调度易于理解和扩展。
我们从一个完美的转发器开始:
template<class U> void foo(U&&u){
foo( std::forward<U>(u), std::is_convertible<U, W>{}, std::is_convertible<U,T>{} );
}
它创建标签类型,在本例中为 true 或 false 类型,用于分派(dispatch)。
这个:
void foo( W, std::true_type, ... );
捕获所有可以转换为 W 的东西。
接下来,我们屏蔽这个:
void foo( T, std::false_type, std::true_type );
从考虑第一个参数可以转换为 W
的情况来看。
最后,这个:
void foo( int, std::false_type, std::false_type );
只有当第一个参数不能转换为任何一个时才可以考虑。
更高级的标签类型,或一次发送一个,都是可能的。
抱歉打字错误。
我在上面使用一个 C++11 功能 -- {}
来构造一个对象。如果您的编译器不支持该 C++11 功能,只需升级您的编译器,现在是 2014 年,随它去吧。否则,将 {}
替换为 ()
。
关于c++ - 避免 C++ 模板中的成员冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24317559/