Когда шаблон полностью специализирован, функцию-член не нужно дублировать. Например, в следующем коде foo()
записывается только один раз.шаблон частичной специализации: как избежать дублирования кода?
#include <iostream>
template<int M>
class B
{
public:
void foo();
private:
void header();
};
template<int M>
void
B<M>::foo()
{
// specialized code:
header();
// generic code:
std::cout << "M = " << M << std::endl;
}
template<int M>
void
B<M>::header()
{
std::cout << "general foo()" << std::endl;
}
template<>
void
B<2>::header()
{
std::cout << "special foo()" << std::endl;
}
Однако для частичной специализации необходимо продублировать определение класса и все функции-члены. Например:
#include <iostream>
template<int M, int N>
class A
{
public:
void foo();
private:
void header();
};
template<int M, int N>
void
A<M, N>::foo()
{
// specialized code:
header();
// generic code:
std::cout << "M = " << M << ", N = " << N << std::endl;
}
template<int M, int N>
void
A<M, N>::header()
{
std::cout << "general foo()" << std::endl;
}
template<int N>
class A<2, N>
{
public:
void foo();
private:
void header();
};
template<int N>
void
A<2, N>::foo()
{
// specialized code:
header();
// generic code:
std::cout << "M = " << 2 << ", N = " << N << std::endl;
}
template<int N>
void
A<2, N>::header()
{
std::cout << "special foo()" << std::endl;
}
Обратите внимание, что A<2, N>::foo()
дубликат A<M, N>::foo()
с 2 вручную заменить M
.
Как можно избежать дублирования кода в этом контексте частичной специализации шаблона?
Я понятия не имел, вы можете специализироваться метод шаблона класса без Специализируя весь класс. – bolov
Связанные: http://stackoverflow.com/q/25119444/951890 –