Wenn eine Vorlage vollständig spezialisiert ist, muss eine Elementfunktion nicht dupliziert werden. Im folgenden Code wird beispielsweise foo()
nur einmal geschrieben.Vorlage teilweise Spezialisierung: Wie kann Codeduplizierung vermieden werden?
#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;
}
jedoch für die partielle Spezialisierung ist es erforderlich, die Klassendefinition und alle Member-Funktionen zu duplizieren. Zum Beispiel:
#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;
}
Hinweis, dass ein Duplikat A<2, N>::foo()
A<M, N>::foo()
mit 2 manuell für M
substituiert ist.
Wie kann eine solche Codeverdopplung in diesem Kontext der Template-Teilspezialisierung vermieden werden?
Ich hatte keine Ahnung, Sie ohne Spezialisierung die ganze Klasse eine Methode für eine Klasse-Vorlage spezialisieren können. – bolov
In Verbindung stehend: http://stackoverflow.com/q/25119444/951890 –