现在我有一个模板类

template <class T>
class b
{
    void someFunc() {
        T t;
        t.setB();
    }
};

我知道模板T仅会实例化为2个类。
class D
{
public:
     void setB();
};

class R
{
public:
     void SetB();
};

如我们所见,类D的函数名称 setB 与R的函数 SetB 不同。因此,在模板类b中,我不能仅使用setB。如果我不能修改D或R,有什么方法吗?我可以在模板类中添加一些包装器或技巧来解决此问题吗?

最佳答案

特质课可以帮助您:

struct Lower {};
struct Upper {};

// trait for most cases
template <typename T>
struct the_trait {
    typedef Lower Type;
};
// trait for special cases
template <>
struct the_trait<R> {
    typedef Upper Type;
};

template <class T>
class b {
public:
    void foo() {
        foo_dispatch(typename the_trait<T>::Type());
    }
private:
    void foo_dispatch(Lower) {
        T t;
        t.setB();
    }
    void foo_dispatch(Upper) {
        T t;
        t.SetB();
    }
};

正如@Arunmu指出的那样,该技术也称为Tag Dispatching

10-04 19:26