After all the knowledge about generic programming using C++
class template, the next one to know will be about some sort of specifics
called C++ Class Template Specialization. There is an exception to every
rule. Any generic code development will need a small case where it needs to
do some hard coding or to avoid some amount generic code. That is where the
C++ class Template Specialization comes in.
The idea of C++
class template specialization is similar to function template
overloading. This can make the template code for certain data
types to be fixed. For example if one wants to write a Queue
class template with the ability to handle all data types. If
he has a good ready made Queue class for character arrays, he
would definitely be interested in re-using it.
The above requirement can be made possible by
C++ Class Template Specialization. Specialization is similar
to
c++ function template overloading. This can help in
optimizing the templates for specific types. Once the template
is specialized, all the member functions should be declared
and defined for the specific data type.
Declaration - C++ Class Template Specialization:
Declaration should include the template
keyword with the class name followed by the type in the
angular brackets.
template<>
class MyQueue<double>
{
std::vector<double> data;
public:
void Add(double const &);
void Remove();
void Print();
};
The above C++ specialized template is the
specialized version of the example used in the
C++ Class
Template article. This sample uses the double data
type for specialization. Though this specific class mentioned
here does not show any optimized code for the double data
type, this can serve the purpose of understanding how a C++
class template specialization works.
Defining Functions for C++ Class Template Specialization:
Now all the functions for this specialized
template should be declared individually for the double
data type. Two of such functions are shown below.
template <> void MyQueue<double> ::Add(double const &d)
{
data.push_back(d);
}
template <> void MyQueue<double>::Print()
{
std::vector <double>::iterator It1;
It1 = data.begin();
cout<<"Double"<<endl;
for ( It1 = data.begin( ) ; It1 != data.end( ) ; It1++ )
cout << " " << *It1<<endl;
}
If the above template MyQueue is used
for double data type, the C++ compiler will not generate
another version of class for the double data type from the
generic MyQueue<typename T> template. Instead it will
use the one defined as above in MyQueue<double>. For
any other data types, the compiler will expand the generic c++
class template and use it.
Partial Specialization - C++ Class Template
Specialization:
The above is the example for full
specialization. Partial C++ template specializations are also
possible. A good example code will be as follows.
template <typename T>
class MyQueue<T,T>{};
The above is the example for partial
specialization with the same type.
template <typename T>
class MyQueue<T,double>{};
The above code is the example for partial
specialization with a data type different from the template
typename.
C++ Class Template specialization can be
employed wherever it is believed that the code can be optimal
if written with the specific data type. Otherwise a normal
generic c++ class template can serve the purpose.