Наиболее распространенное и ценное использование функций шаблонов-членов, с которыми я сталкиваюсь в своей повседневной жизни, - это уменьшение сложности кода путем предоставления одной шаблонной функции вместо множества функций, которые по сути делают одно и то же.
Например, предположим, что вы работаете на сервере, который получает полдюжины связанных сообщений и сохраняет входящие данные в полдюжине таблиц в базе данных. Простая реализация заключается в реализации 6 функций обработки сообщений (псевдокод):
class MessageProcessor
{
void OnMessage(const char* msg);
void ProcessMessage100(Data100* data);
void ProcessMessage101(Data101* data);
void ProcessMessage102(Data102* data);
void ProcessMessage103(Data103* data);
void ProcessMessage104(Data104* data);
void ProcessMessage105(Data105* data);
};
MessageProcessor::OnMessage(const char* msg)
{
unsigned int * msgType = ((unsigned int*)msg);
switch( *msgType )
{
case 100 :
ProcessMessage100((Data100*),sg);
break;
case 101 :
ProcessMessage101((Data101*),sg);
break;
::
}
}
MessageProcessor::ProcessMessage100(Data100* data)
{
Record100* record = GetRecord100(key);
record->SetValue(xyz);
}
MessageProcessor::ProcessMessage101(Data101* data)
{
Record101* record = GetRecord101(key);
record->SetValue(xyz);
}
: :
Здесь есть возможность обобщить функции ProcessMessage (), поскольку они по сути делают одно и то же:
class MessageProcessor
{
OnMessage(const char* msg);
template<class Record, class Data> void Process(Data* data);
};
template<class Record, class Data>
void MessageProcessor::Process<Record,Data>(Data* data)
{
Record* record = GetRecord(key);
record->SetValue(xyz);
}
Функция GetRecord также может быть обобщена, давая кодовую базу с 2 функциями, где их было 12. Это улучшает код, поскольку он проще с меньшим количеством движущихся частей, проще для понимания и обслуживания.