[英]What is the use of member template functions in c++?
給定一個具有成員模板函數的類,如下所示:
template <typename t>
class complex
{
public:
complex(t r, t im);
template<typename u>
complex(const complex<u>&);
private:
//what would be the type of real and imaginary data members here.
}
我對成員模板功能感到困惑,請提供一個示例,通過該示例,我可以清楚地了解成員模板功能的需求。
另外,告訴我在c ++中使用成員模板函數,我們使用成員模板函數的情況是什么?
它使您能夠進行轉換:
complex<int> ci;
complex<float> cf(ci);
因此,如果您有兩種類型T1和T2,並且可以將T1分配給T2,則可以將complex<T1>
分配給complex<T2>
。
至於你的代碼中的問題(這里的實數和虛數數據的類型是什么):
template <typename t>
class complex
{
...
private:
t real_part;
t imaginary_part;
};
我在日常工作中遇到的成員模板函數最常見的有價值用途是通過提供一個模板化函數而不是許多基本相同的函數來降低代碼復雜性。
例如,假設您正在處理收到六條相關消息的服務器,並將傳入的數據保存到數據庫中的六個表中。 一個簡單的實現是實現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函數也可以進行泛化,產生一個帶有2個函數的代碼庫,其中曾經有12個函數。由於它更簡單,運行部件更少,更易於理解和維護,因此改進了代碼。
成員函數模板的一般目的和功能與普通(非成員)函數模板沒有任何不同。 唯一[不相關]的區別是成員函數可以訪問隱式this
參數。
您了解普通功能模板的一般用途,對嗎? 那么,在這種情況下,您應該了解成員函數模板的一般用途,因為它完全相同。
使用您提供的示例,成員模板函數允許您從complex<U>
構造complex<T>
的實例。
作為一個可能有用的具體例子,假設你有一個complex<double>
但想要一個complex<float>
。 如果沒有構造函數,則類型不相關,因此常規復制構造函數不起作用。
通常,您希望班級的某些成員函數在某個范圍內運行。 通過模板化的成員函數,您可以在不提供自由功能的情況下獨立於提供范圍的容器進行操作。
Functors也是如此。 通常你會編寫一個函數來運行一些特殊的迭代器,但很快就會發現Functor可以在任何類型的范圍內運行。 因此,不是通過封裝結構提供模板參數,而是通過成員函數operator()提供它們,並使類型推導成為可能。
首先想到的例子:
在一些容器構造函數(或賦值方法)中獲取未知類型的輸入迭代器。
std::complex
允許在不同於std::complex
實例化的類型上運行。
在shared_ptr
(無論是std::tr1::
還是boost::
std::tr1::
,您可以將不同類型的指針保存到堆中的共享對象實例中(可以為其獲取指針類型)。
在thread
(無論是std::
in c ++ 0x還是boost::
:)中接收將由線程實例調用的未知類型的仿函數。
在所有情況下,用法都是相同的:您有一個對未知類型進行操作的函數。 正如AndreyT完美地陳述與常規函數相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.