现在我有一个模板类
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。