在执行SFINAE

时间:2017-04-09 13:49:22

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

Demo

template <typename T>
struct A {
    void mem_func() {
        // This works!!! Can access static_func<int>();
        std::cout << T::template static_func<int>() << '\n';
    }
    template <typename K>
    static constexpr bool static_func() { return true; }

    template <typename T1>
    typename std::enable_if<T::template static_func<T1>(), void> sfinae_func() { 
        // This breaks!!! T is an incomplete type??
        std::cout << "This fails" <<'\n';
    }
};

struct B : A<B> {
};

在这里,我不明白为什么T :: static_func在成员函数foo()中工作,但是当我去实例化sfinae_func时,由于T不完整,因此无法访问相同的T :: static_func!这怎么可能?

跟进是这样的: 如果标准限制我在enable_if中访问T :: static_func,是否有一种解决方法可以在需要时用T :: static_func隐藏A :: static_funct?

template <typename T1>
    typename std::enable_if<T::template static_func<T1>(), void> sfinae_func()

如果调用T的static_func使T的static_func隐藏A的static_func,那么需要做什么才能启用?

1 个答案:

答案 0 :(得分:2)

要解决此问题,您可以通过T sfinae_func其他模板参数的默认值来延迟类型实例化,例如如下(哦,不要忘记使用std::enable_if的内部类型来实际执行sfinae):

#include <iostream>
template <typename T>
struct A {
    void mem_func() {
        std::cout << T::template static_func<int>() << '\n';
    }
    template <typename K>
    static constexpr bool static_func() { return true; }

    template <typename T1, typename TT = T>
    typename std::enable_if<TT::template static_func<T1>(), void>::type sfinae_func() {
        std::cout << "This fails" <<'\n';
    }
};

struct B : A<B> {
};
int main() {
    B a;
    a.mem_func();
    a.sfinae_func<int>();
}

[live demo]