2014-09-01 3 views
2

У меня такая же реализация для 2 методов, они оба вставляют аргумент в текстовый файл.Метод Virtual & Template C++

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() должен быть виртуальным.
Как я могу с этим справиться?

+3

Поместите их обратно в отдельные функции ... шаблоны не могут быть 'virtual'. –

+0

@TonyD, разве нет трюка? –

+0

@yaelaviv Я пытался это сделать. Нет, нет, если вы не возражаете против возможности использовать полиморфизм во время выполнения. Тогда вы можете (** вид **) достичь этого с помощью [CRTP] (http://eli.thegreenplace.net/2011/05/17/the-curiously-recurring-template-pattern-in-c/) – druckermanly

ответ

2

Вы не можете создать виртуальный шаблонный метод (пока).
Но, если вы хотите шаблон просто так вы не должны иметь код везде, вы можете просто позвонить шаблонный метод из перегруженных методов (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++

+0

@TonyD Я представлял это. Исправлена. –

1

Один трюк для получения «шаблонного виртуального метода» - это иметь шаблонный, не виртуальный метод в базовом классе, делать все шаблонные материалы, а затем передавать результаты в полигональной форме времени выполнения в виртуальную вспомогательную функцию. Например, здесь вы можете иметь template<typename T> void WriteToFile(T) в базовом классе, который преобразовал аргумент в строку, а затем передал эту строку методу virtual void WriteToFile_aux(string).

Конечно, это зависит от возможности отделить параметрический полиморфизм от полиморфизма подтипов.