Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用SFINAE检查模板参数继承_C++_C++11_Templates_Inheritance_Sfinae - Fatal编程技术网

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
}