虚拟&模板C++

Virtual & Template method C++

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

1
2
3
4
5
6
7
8
9
10
11
void WriteToFile( double content) //for double
{
    streamFile << content;
    streamFile << flush;
}

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

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

1
2
3
4
5
6
template < class T>
void WriteToFile(T content)
{
    streamFile << content;
    streamFile << flush;
}

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


您还不能创建虚拟模板化方法。但是,如果您希望模板不必到处都有代码,您可以从重载方法中调用模板化方法(代码重用):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
}

关于这个有很多讨论…

C++类成员函数模板可以是虚拟的吗?C++虚拟模板方法如何在C++中实现"虚拟模板功能"


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

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