c++ - 避免 C++ 模板中的成员冲突

标签 c++ templates

我有课

template <typename T, typename W>
class A {
    void foo(W);
    void foo(T);
    void foo(int);
}

T=intW=intW=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/

相关文章:

c++ - 如何专门化模板类成员函数?

python - 我想在我的网站上有一个按钮来执行 python 脚本

c++ - 如何消除构造函数选择的强制转换

c++ - 如何重载模板函数以用于枚举?

c++ - 模板参数是否可以进行矩阵乘法

c++ - 如何修复这种典型的异常不安全代码?

android - fatal error : iostream: No such file or directory

python - 如何使用 Boost Python 将 C++ bool 转换为 Python boolean?

c++ - libstdc++对std::declval的实现问题

c++ - 如何在 MFC 中获得多行工具提示