在c ++中使用成员模板函数有什么用?

Zia*_*man 4 c++ oop

给定一个具有成员模板函数的类,如下所示:

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.
}
Run Code Online (Sandbox Code Playgroud)

我对成员模板功能感到困惑,请提供一个示例,通过该示例,我可以清楚地了解成员模板功能的需求.
另外,告诉我在c ++中使用成员模板函数,我们使用成员模板函数的情况是什么?

R S*_*hko 5

它使您能够进行转换:

complex<int> ci;

complex<float> cf(ci);
Run Code Online (Sandbox Code Playgroud)

因此,如果您有两种类型T1和T2,并且可以将T1分配给T2,则可以将a分配complex<T1>给a complex<T2>.

至于你的代码中的问题(这里的实数和虚数数据的类型是什么):

template <typename t>
class complex
{
...
private:
    t real_part;
    t imaginary_part;
};
Run Code Online (Sandbox Code Playgroud)

  • @JohnDibling - OP似乎理解模板成员函数是什么,而不是为什么需要它们.第一部分回答了这个问题.至于这个例子,它只是回应他的代码中的问题(//这里的实数和虚数数据的类型是什么). (2认同)

Joh*_*ing 5

我日常遇到的成员模板函数最有价值的用途是通过提供一个模板函数而不是执行基本相同功能的许多函数来降低代码复杂性。

例如,假设您正在一台服务器上工作,该服务器接收六打相关消息并将传入的数据保存到数据库中的一打表中。一个简单的实现是实现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);
}

: :
Run Code Online (Sandbox Code Playgroud)

这里有一个概括化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);
}
Run Code Online (Sandbox Code Playgroud)

还可以对GetRecord函数进行泛化,从而产生具有2个函数(以前是12个)的代码库。这通过改进代码,使移动部件更少,更易于理解和维护来改善代码。