У меня есть класс, все с точно таким же интерфейсом. Этот интерфейс определяет несколько методов, некоторые из которых являются шаблонами (сам класс может быть или не быть).Передача объектов разных типов с тем же интерфейсом
Так выглядит интерфейс что-то вроде этого
class MyClass
{
public:
void Func1();
template <typename T>
void Func2(T param);
};
У меня есть ряд функций, которые принимают различные объекты, которые соответствуют этому интерфейсу, но хотят, чтобы избежать необходимости знать точное выполнение во время компиляции.
Очевидно, что решение по умолчанию C++ должно было иметь базовый тип, из которого все эти классы вытекают и передают указатель на него, а полиморфизм выполняет всю работу.
Проблема в том, что шаблонные функции-члены не могут быть виртуальными, поэтому этот метод не может быть использован. Я также хочу избежать изменения текущего набора классов, которые следуют за этим интерфейсом, потому что их большое количество, некоторые из которых определены вне сферы моего проекта.
Другим решением является шаблон функций, которые используют эти объекты, поэтому они специализируются на правильном типе. Это может быть решением, но из-за устаревших требований шаблонирование большого числа функций может оказаться невозможным (я не могу ничего сделать, поскольку клиентский код не является тем, за что я несу ответственность).
Моя первоначальная мысль состояла в том, чтобы предоставить какой-то класс несущей, который является нейтральным по типу, и в эффектах обтекает общий интерфейс здесь и имеет класс базового интерфейса для передачи внутреннего типа.
Что-то вдоль линий
class MyInterface
{
public:
virtual void Func1() = 0;
};
template <typename T>
class MyImplementation
{
public:
virtual void Func1()
{
m_impl->Func1();
}
private:
T* m_impl;
};
Но опять же шаблонная функция-членов, кажется, чтобы блокировать этот подход.
Я посмотрел на классы boost :: any и boost ::, которые, как я думал, могут предложить какое-то решение, но они, похоже, не дают мне правильного ответа.
Итак, есть ли у кого-нибудь какие-либо предложения или о том, как это сделать, если это действительно так? Лично я склоняюсь к тому, чтобы создавать шаблоны для различных функций, требующих этих объектов, - так как это шаблоны функциональных возможностей, - но считал, что стоит исследовать в первую очередь.
Заранее спасибо
Какую проблему вы действительно пытаетесь решить? –
У меня есть ряд функций, которые принимают различные объекты, которые соответствуют этому интерфейсу, но хотят избежать необходимости знать точную реализацию во время компиляции. –
Вы можете попробовать проверить вопросы о том, что кажется вашей главной проблемой: как решить проблему с функцией виртуального шаблона. Я знаю, что видел это пару раз раньше. Я не уверен, что вы найдете свое решение там, но это будет хорошим началом. – n1ckp