Частичная специализация определенных функций-членов

#include <iostream>

template <typename T1, typename T2>
class B{
public:
    void update(){ std::cerr<<__PRETTY_FUNCTION__<<std::endl; }
    void func1(){ std::cerr<<__PRETTY_FUNCTION__<<std::endl; }
    void func2(){ std::cerr<<__PRETTY_FUNCTION__<<std::endl; }
};

template <typename T1>
class B<T1, int>{
public:
    void update(){ std::cerr<<__PRETTY_FUNCTION__<<"(specialization)"<<std::endl;}
};

int main(){
    B<int, double> b1;
    b1.update();
    b1.func1();
    B<int, int> b2;
    b2.update();
    //b2.func1();//there's no function 'func1' in B<int,int>
}

Я хочу специализировать функцию update для определенного параметра шаблона (типа данных).

Итак, я попытался специализировать template class B, но, похоже, мне нужно снова реализовать целые функции-члены.

Поскольку другие члены в разных специализациях абсолютно одинаковы, повторная реализация целых членов выглядит громоздкой.

Есть ли обходной путь для этого случая?


person JaeJun LEE    schedule 30.05.2016    source источник
comment
Возможный дубликат функции-члена частичной специализации шаблона c++   -  person LogicStuff    schedule 30.05.2016


Ответы (1)


Тег-отправить вызов на update:

template <typename> struct tag {};

template <typename T1, typename T2>
class B
{
public:
    void update()
    {
        return update(tag<B>());
    }

private:
    template <typename U1>
    void update(tag<B<U1, int> >)
    {
        // specialization
    }

    template <typename U1, typename U2>
    void update(tag<B<U1, U2> >)
    {
        // normal
    }
};

ДЕМО

person Piotr Skotnicki    schedule 30.05.2016