使用 SFINAE 检查模板参数继承
Checking template parameter inheritance with SFINAE
我有一个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
}
现在我还有其他一些继承Good
的类Derived
。不过,它不会继承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>
。这种简化的任何解决方案也值得赞赏。
似乎我解决了它,这要归功于这个答案:
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
}
相关文章:
- 为什么C++构造函数在继承中需要默认参数?
- C++接口继承不同的参数方法
- 如何在继承层次结构中调用具有默认参数的构造函数?
- 模板的继承参数设置
- 使用多参数包可变参数模板继承类
- 使用继承初始化C++中的参数
- 可变参数模板和具有继承的默认值
- C++ 模板元编程:从模板模板参数继承
- 有没有一种干净(更)的方法将 CRTP 与可变参数继承混合在一起?
- 使用 SFINAE 检查模板参数继承
- 从Swift中的通用参数继承的替代方案
- C++中的模板参数继承
- 使用 Boost 确保模板参数继承自某个类
- 模板函数参数继承
- C++:从模板参数继承
- 模板类参数继承
- 从模板参数继承是不好的做法
- 从模板参数继承类
- 使用内部类型作为模板参数继承模板类
- 如何以抽象类作为参数继承和实现纯虚方法