Как использовать enable_if для включения функций-членов на основе параметра шаблона класса

В коде:

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 . Я думал, что могу включить одну или вторую функцию-член из набора функций-членов во время компиляции, но это не работает. Не мог бы кто-нибудь объяснить мне, как это сделать правильно?
Отредактировано
Чего я действительно не могу понять, так это того, почему нет typedef в одном из этих def. Компилятор не может его найти и не скомпилирует.

12
задан Björn Pollex 2 May 2013 в 08:56
поделиться