【问题标题】:Checking template parameter inheritance with SFINAE使用 SFINAE 检查模板参数继承
【发布时间】: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&lt;Derived&gt;。不过,我不想声明f(Derived)

class Derived : public Good {};

int main() {
    f(Derived()); // OK, but should be compilation error
}

所以,我要检查类型 TT 是一些 R&lt;P&gt; 的后代,其中 PT 的一些父项。

SFINAE 可以做到吗?我想留在 C++11 的范围内。

虽然我对如何解决这个一般问题非常感兴趣,但在我的确切情况下,有一个简化:我知道在T 的所有父母中,对于任何P,最多有一个R&lt;P&gt;。对于这种简化的任何解决方案也值得赞赏。

【问题讨论】:

    标签: c++ c++11 templates inheritance sfinae


    【解决方案1】:

    看来我解决了,感谢this answer

    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
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多