【发布时间】:2014-07-24 14:43:03
【问题描述】:
假设我有一个纯抽象基类。类模板实现了这个接口,并且是专门的。现在,我的问题是这个专业化应该能够处理专业化的子类。所以,我尝试了 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();
}
关于如何解决这个问题的任何想法? 谢谢!!
【问题讨论】:
-
试试
virtual void foo() = 0 -
@Ylisar 抱歉,这是示例中的一个错字。当然,如果它不是虚拟的,我会有其他问题。
标签: c++ templates c++11 template-specialization enable-if