2013-04-19 4 views
1

У меня есть класс Foo, который предоставляет некоторую функциональность. Чтобы поддерживать модульность, Foo должен быть интерфейсом (т. Е. Классом C++ только с абстрактными методами), а реализация Foo может выбрать, как именно реализовать функциональность. Однако мой интерфейс включает в себя метод шаблона. То есть,Интерфейс для методов шаблонов

class Foo 
{ 
public: 
     template<class T> 
     void functionality(const T&); 
}; 

невозможно в C++ иметь шаблонные методы virtual. Есть ли какой-либо метод, который может достичь аналогичного результата (модульность и полиморфизм) с помощью шаблонных методов?

+1

У вас есть конечный, заранее определенный набор типов, с которыми вам нужно это работать? Существуют ли какие-либо свойства 'T', вроде« должен быть целочисленным типом »или« должен быть похожим на функтор »или« должен быть числовым типом », который вы можете нам предоставить? Вам нужны расширения сторонних разработчиков через классы признаков или подобную поддержку? Что, * точно *, делает «функциональность»? Насколько важна производительность в этом случае? (а не просто «мне нравится быстро»: «эта функция должна запускаться один раз на пиксель на 7 Мпх изображения при 60 Гц»). В основном ли алгоритм игнорирует значение 'T', действующего в качестве носителя? – Yakk

+0

http://stackoverflow.com/questions/7968023/c-virtual-template-method – didierc

+0

http://stackoverflow.com/questions/2354210/can-a-member-function-template-be-virtual – didierc

ответ

1

Вы не можете использовать полиморфизм времени выполнения, смешанный непосредственно с шаблонами. Однако может помочь другой слой косвенности. Вот надуманный пример:

template <typename T> 
inline void *New(void) 
{ 
    return new T(); 
} 

Эта функция позволит пользователю динамически выделять любой тип объекта, пока конструктор по умолчанию существует. Теперь возьмите указатель на функцию и назначить его на эту новую функцию:

void *(*NewFuncPtr)(void) = New<int>; 
int *i = (int *)NewFuncPtr(); 

Сама функцию указатель не шаблонные, но может указывать на функцию, шаблонные. Возможно, это также может решить вашу ситуацию.

+0

Хотя я решил решить проблему без шаблонов (И с помощью метода «string getType()»), это решение может быть действительно полезным, и поэтому я принимаю его. Благодаря! – Edgepo1nt

Смежные вопросы