现在我有了一个模板类
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 .
关于当模板的功能不相同时的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31803939/