C++ 使用SFINAE检查模板参数继承
我有一个助手类C++ 使用SFINAE检查模板参数继承,c++,c++11,templates,inheritance,sfinae,C++,C++11,Templates,Inheritance,Sfinae,我有一个助手类R,有些类T继承它。我想为那些不继承R的类声明一些函数f(tt)。这在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&l
R
,有些类T
继承它。我想为那些不继承R
的类声明一些函数f(tt)
。这在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
}
因此,我想检查类型T
是T
是一些R
的后代,其中p
是T
的父代
可以用SFINAE来做吗?我希望保持在C++11的范围内
虽然我真的对如何解决这个一般问题很感兴趣,但在我的例子中有一个简化:我知道在所有
T
的父母中,对于任何p
,最多有一个R
。对于这种简化的任何解决方案,我们也表示感谢。似乎我已经解决了它,这要感谢:
模板
结构SmartBaseOf{
私人:
模板
静态自动测试(const Base&->typename std::enable_if<
std::是::value的基础吗&&
std::是::value的_base,
std::true_type>::type;
静态标准:假_型试验(…);
公众:
constexpr static bool value=decltype(test(Derived())::value;
};
模板
自动f(T/*T*/)->typename std::enable_if<
!SmartBaseOf::value>::类型
{
//做点什么
}
class Derived : public Good {};
int main() {
f(Derived()); // OK, but should be compilation error
}
template<template<typename> class Base, typename Derived>
struct SmartBaseOf {
private:
template<class Intermediate>
static auto test(const Base<Intermediate>&) -> typename std::enable_if<
std::is_base_of<Intermediate, Derived>::value &&
std::is_base_of<Base<Intermediate>, Intermediate>::value,
std::true_type>::type;
static std::false_type test(...);
public:
constexpr static bool value = decltype(test(Derived()))::value;
};
template<typename T>
auto f(T /* t */) -> typename std::enable_if<
!SmartBaseOf<R, T>::value>::type
{
// do something
}