Quando un modello è completamente specializzato, non è necessario duplicare una funzione membro. Ad esempio, nel seguente codice, foo()
viene scritto una sola volta.: Come si può evitare la duplicazione del codice?
#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;
}
Tuttavia, per la specializzazione parziale, è necessario duplicare la definizione della classe e tutte le funzioni membro. Ad esempio:
#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;
}
noti che A<2, N>::foo()
un duplicato di A<M, N>::foo()
con 2 sostituito manualmente M
.
Come si può evitare tale duplicazione del codice in questo contesto di specializzazione parziale del modello?
Non avevo idea che è possibile specializzarsi un metodo per un modello di classe senza specializzata tutta la classe. – bolov
Correlati: http://stackoverflow.com/q/25119444/951890 –