c – 如何使用enable_if根据类的template参数启用成员函数

前端之家收集整理的这篇文章主要介绍了c – 如何使用enable_if根据类的template参数启用成员函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
代码
template<class T>
struct is_builtin
{
    enum {value = 0};
};

template<>
struct is_builtin<char>
{
    enum {value = 1};
};

template<>
struct is_builtin<int>
{
    enum {value = 1};
};

template<>
struct is_builtin<double>
{
    enum {value = 1};
};

template<class T>
struct My
{
    typename enable_if<is_builtin<T>::value,void>::type f(T arg)
    {
        std::cout << "Built-in as a param.\n";
    }


    typename enable_if<!is_builtin<T>::value,void>::type f(T arg)
    {
        std::cout << "Non - built-in as a param.\n";
    }
};

struct A
{
};

int main()
{
    A a;
    My<int> m;
    My<A> ma;
    m.f(1);
    ma.f(a);
    return 0;
}

我收到一个错误

error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'

显然我不明白如何使用enable_if.我在想的是,我可以在编译时从一组成员函数启用一个或第二个成员函数,但是它不起作用.任何人都可以向我解释如何正确执行?
编辑
我真的不明白的是为什么在其中一个def没有typedef.编译器找不到它,它不会编译它.

解决方法

您不能使用类模板参数来获取成员函数的SFINAE.

你要么需要

>使成员函数改为成员函数模板,并在成员函数模板的模板参数上使用enable_if>将成员函数f移动到策略类中,并使用enable_if专门化类模板.

猜你在找的C&C++相关文章