带有抽象基类的子类的模板特化
C++ Template specialization for subclasses with abstract base class
假设我有一个纯抽象基类。类模板实现这个接口,并且是专门化的。现在,我的问题是这个专门化应该能够处理专门化的子类。所以,我尝试了enable_if,但随后子类最终被抽象…我怎么才能避开这个问题呢?
由例子:// This example doesn't work because a subclass of A does not satisfy the
// specialization for B<T>::foo()
class A {
public:
virtual void foo() = 0;
};
template <class T>
class B : public A {
...
public:
...
void foo();
...
};
void B::foo() {
...
}
template <>
void B<A>::foo() {
...
}
class C : A {
...
public:
...
void foo();
...
};
int main() {
B<C> bar; // I was like "this is gonna work!! :) :D"
bar.foo(); // But this calls B::foo() instead of B<A>::foo()... :'( *sob*
}
还有一个例子:
// This example doesn't work because B ends up being abstract
class A {
public:
virtual void foo() = 0;
};
template <class T>
class B : public A {
...
public:
...
template <class U=T>
typename std::enable_if<!std::is_base_of<U, A>::value, void>::type
foo() {
...
}
template <class U=T>
typename std::enable_if<std::is_base_of<U, A>::value, void>::type
foo() {
...
}
};
class C : A {
...
public:
...
void foo();
...
};
int main() {
// I got excited thinking this would work (^.^)/
B<C> bar; // and then it didn't because B is abstract /(-_-) ...
bar.foo();
}
对于如何解决这个问题有什么想法吗?谢谢! !
B<C>
和B<A>
是不同的类型,所以你的第一种情况永远不会起作用。
您要做的是专门化模板为std::is_base_of<A, T>::value
是true
的所有类T
。为此,使用部分专门化的默认模板参数:
template <class T, bool = std::is_base_of<A, T>::value>
class B : public A {
public:
void foo() override { std::cout << "A is not base of T!" << std::endl; }
};
template <class T>
class B<T, true> : public A {
public:
void foo() override { std::cout << "A is base of T!" << std::endl; }
};
当A是T的基时,bool
参数为true
,因此使用部分专门化。否则,使用基本模板。
请注意,即使A
是T
不可访问的基础,is_base_of
也会返回true
,因此您可能还需要添加is_convertible<T*, A*>
检查。
演示。
相关文章:
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 如何将抽象类的可访问性限制为另一个抽象类及其子类?
- 如何从其抽象母类上的指针初始化子类?
- 使用抽象类的容器来保存子类
- 从子类中的抽象类调用方法
- 从子类到具有相同基数的抽象子类的隐式转换
- 尝试引用子类中的抽象对象时收到编译错误
- 抽象基类的抽象子类
- 在C++中初始化抽象基类的子类数组
- 在抽象类c的子类中使用来自抽象类的引用
- 防止在C++中对抽象类接口进行子类化
- 使用抽象类的子类专门化模板
- 我可以从子类以外的另一个类调用抽象基类的公共赋值运算符吗?
- 如何使用委托来抽象子类中调用基成员的方式
- 视觉 是否可以覆盖子类中的函数C++而无需对抽象的父类中的函数使用 virtual 关键字
- 如何将子类分配给函数中的抽象类指针
- 在超类中调用抽象方法,并在C++中的子类中实现它
- C++方法返回指向抽象类的指针,需要使用来自子类的方法