假设我们有一些模板化的B类:
template<class T>
class B {
public:
B(void) { (void)static_cast<C*>((T*)0) }
~B(void) {}
unsigned as_int(void) { return this->internal_state; }
private:
unsigned internal_state;
}
其模板接受C类及其派生类(由于上面构造函数中的静态强制转换):
class C {
//something
}
class D
: public C {
//something
}
如果我们有第三类A:
class A {
public:
A(void) { //something };
~A(void) { //something };
inline A& operator = (B<C>& rhs) { this->internal_state = rhs.as_int(); }
inline A& operator = (B<D>& rhs) { this->internal_state = rhs.as_int(); }
private:
unsigned internal_state;
}
我想要做的是提供赋值运算符的重载,它接受B类作为右侧。在上面的代码片段中,这个工作正常,但是只有我分别为B的每个模板(B,B等)重载。是否有可能为某些通用B重载一次
答案 0 :(得分:2)
两条评论。首先,如果你想要只在C和它的孩子上模仿B,你应该只做一个static_assert:
std::static_assert(std::is_base_of<C, T>::value, "Error: T not child of C!")
其次,您确实可以编写一个泛型赋值运算符,如anxieux建议的那样:
template <typename T>
A& operator= (B<T> & rhs) { ... } // inline implied inside class declaration