我在日常工作中遇到的成員模板函數最常見的有用用法是通過提供一個模板函數而不是執行基本相同的功能的許多函數來降低代碼複雜度。
例如,假設您正在一臺服務器上工作,該服務器接收半打相關的消息,並將傳入的數據保存到數據庫中的半打表中。一個簡單的實現將實現6個消息處理函數(psudocode):
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函數也可以進行通用化處理,產生一個代碼庫,其中有兩個函數,以前的版本是12.這改進了代碼,因爲它更簡單,移動部件更少,更易於理解和維護。
格式化您的問題並縮進代碼時請格外小心。 – avakar 2010-02-25 18:12:23