Специализированный шаблон функции-члена нешаблонного класса

Допустима ли следующая специализация шаблона функции-члена bar? Он компилируется на gcc 4.5.3 и VS .NET 2008. Я сбит с толку, потому что смутно припоминаю, что читал, что шаблоны функций не могут быть специализированы.

struct Foo
{
    template<typename T>
    void bar();
};

template<typename T>
void Foo::bar(){}

template<>
void Foo::bar<bool>(){}

int main()
{
    Foo f;
    f.bar<char>();
    f.bar<bool>();
}

person Olumide    schedule 13.01.2014    source источник


Ответы (2)


Шаблон функции не может быть частично специализированным, но может быть специализированным явно, ваш код совершенно правильный.

person ForEveR    schedule 13.01.2014

Частичная специализация шаблона функции рассматривалась в C++11, но отклонено, поскольку для решения той же проблемы можно использовать перегрузку шаблона функции. Однако есть некоторые предостережения, которые необходимо учитывать при этом.

Пример:

template <typename T> void foo(T);
void foo(int);

foo(10);   // calls void bar(int)
foo(10.f); // calls void bar(T) [with T = float]
foo(10u);  // calls void bar(T) [with T = unsigned int]!!

В вашем случае что-то в этом роде может подойти

struct Foo
{
    template<typename T>
    void bar(T dummy);

    void bar(bool dummy);
};

template<typename T>
void Foo::bar(T dummy) { }

void Foo::bar(bool dummy) { }

int main()
{
    Foo f;
    f.bar('a');
    f.bar(true);
}
person legends2k    schedule 13.01.2014