#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 параметр, а не оба. Вы также можете написать другой класс, который реализует методы и наследовать от него.