【发布时间】:2017-03-16 09:42:30
【问题描述】:
我有一个辅助类R<T>,一些类T继承了它。我想为那些不继承R<T> 的类声明一些函数f(T t)。这可以通过 SFINAE 轻松完成:
template<typename T>
class R {};
class Good : public R<Good> {};
class Bad {};
template<typename T>
auto f(T /* t */) -> typename std::enable_if<
!std::is_base_of<R<T>, T>::value>::type
{
// do something
}
int main() {
f(Good()); // compilation error
f(Bad()); // OK
}
现在我有一些其他类Derived 继承Good。但它不继承R<Derived>。不过,我不想声明f(Derived)。
class Derived : public Good {};
int main() {
f(Derived()); // OK, but should be compilation error
}
所以,我要检查类型 T 是 T 是一些 R<P> 的后代,其中 P 是 T 的一些父项。
SFINAE 可以做到吗?我想留在 C++11 的范围内。
虽然我对如何解决这个一般问题非常感兴趣,但在我的确切情况下,有一个简化:我知道在T 的所有父母中,对于任何P,最多有一个R<P>。对于这种简化的任何解决方案也值得赞赏。
【问题讨论】:
标签: c++ c++11 templates inheritance sfinae