Специализированный шаблон члена, когда класс имеет несколько параметров шаблона?

#c #templates #c 11

#c #шаблоны #c 11

Вопрос:

В следующем шаблоне класса мы можем специализировать элемент Foo::Bar() для определенного типа, скажем T = int :

 template <typename T>
class Foo
{
public:
    void Bar()
    {
       std::cout << "generic Bar()" << std::endl;
    }
};

template<>
void Foo<int>::Bar()
{
    std::cout << "specialized Bar()" << std::endl;
}

int main()
{
    Foo<char> generic_foo;
    Foo<int> specialized_foo;

    generic_foo.Bar();
    specialized_foo.Bar();

    return 0;
}
  

Как мы можем сделать то же самое, если класс Foo имеет несколько параметров шаблона:

 template <typename T, int N>
class Foo
{
public:
    void Bar()
    {
       std::cout << "generic Bar()" << std::endl;
    }
};

// How can we specialize Foo::Bar() for T = int?

int main()
{
    Foo<char, 0> generic_foo;
    Foo<int, 0> specialized_foo;

    generic_foo.Bar();
    specialized_foo.Bar();

    return 0;
}
  

Я попробовал несколько альтернатив специализации Foo::Bar() для T = int , в том числе:

 template<int N>
void Foo<int, N>::Bar()
{
    std::cout << "specialized Bar()" << std::endl;
}
  

но компилятор отказался от них всех.

Ответ №1:

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

 template<int N>
class Foo<int, N>
{
public:
   void Bar()
   {
      std::cout << "specialized Bar()" << std::endl;
   }
};
  

Комментарии:

1. О, так что, если Foo содержит 10 других членов функции, но только Bar() должен быть специализирован с T = int, определения всех этих 10 функций должны быть продублированы?

2. @user1387866 да, если вы хотите специализировать только 1 параметр, а не оба. Вы также можете написать другой класс, который реализует методы и наследовать от него.