【问题标题】:Virtual & Template method C++虚拟和模板方法 C++
【发布时间】:2014-10-25 10:43:42
【问题描述】:

我对 2 种方法有相同的实现,它们都将参数插入到文本文件中。

void WriteToFile( double content) //for double
{
    streamFile << content;
    streamFile << flush;
}

void WriteToFile( int content) //for integer
{
    streamFile << content;
    streamFile << flush;
}  

实现是相同的,因此我将它们合并到一个模板方法:

template < class T>
void WriteToFile(T content)
{
    streamFile << content;
    streamFile << flush;
}  

但是WriteToFile() 方法应该是虚拟的。
我该如何处理?

【问题讨论】:

  • 把它们放回单独的函数...模板不能是virtual
  • @TonyD,难道没有诀窍吗?
  • @yaelaviv 我试过这样做。不,没有,除非您不介意破坏运行时多态性的能力。然后你可以(一种)使用CRTP 实现这一目标
  • @yaelaviv:这取决于“它”是什么......如果您使用模板只是为了避免基类实现中的重复代码,那么您可以调用非模板化成员函数执行实际工作的私有非虚拟模板成员函数,包括调用具有已知类型的虚拟函数(如果有帮助)。如果你想让一个类神奇地允许新的客户端代码为新类型调用它,并让额外的virtual 函数出现 - 不。虚拟函数的部分想法是虚拟调度表具有已知的大小和布局。
  • @TonyD,谢谢,“私有非虚拟模板成员函数”是什么意思?

标签: c++ templates virtual


【解决方案1】:

您还不能创建虚拟模板化方法。
但是,如果您只需要模板以便不必到处都有代码,则可以从重载方法中调用模板化方法(Code reuse)

template < class T>
void WriteToFileT(T content)
{
    streamFile << content;
    streamFile << flush;
}  

virtual void WriteToFile( double content) //for double
{
   WriteToFileT(content);
}

virtual void WriteToFile( int content) //for integer
{
   WriteToFileT(content);
}

关于这个有很多讨论...

Can a C++ class member function template be virtual?
C++ Virtual template method
How to achieve "virtual template function" in C++

【讨论】:

  • @TonyD 我在想象。固定。
【解决方案2】:

获得“模板化虚拟方法”的一个技巧是在基类中有一个模板化的非虚拟方法,完成所有模板化的工作,然后将结果以运行时多态形式传递给虚拟辅助函数。例如,您可以在基类中有一个template&lt;typename T&gt; void WriteToFile(T),它将参数转换为字符串,然后将该字符串传递给virtual void WriteToFile_aux(string) 方法。

当然,这依赖于能够将参数多态性与子类型多态性分开。

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 2011-12-19
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2016-04-12
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多