У меня есть номер класса, все с точно таким же интерфейсом.Этот интерфейс определяет несколько методов, некоторые из которых являются шаблонными (сам класс может или не может быть).
Таким образом, интерфейс выглядит примерно так
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 ::классы функций, которые, как я думал, могли бы предложить какое-то решение, но они, похоже, не дают мне правильного ответа.
Итак, есть ли у кого-нибудь какие-либо предложения или обходные пути, как сделать это возможным, если это действительно так?является?Лично я склоняюсь к тому, чтобы шаблонировать различные функции, которые требуют этих объектов - поскольку это функциональные возможности, предоставляемые шаблонами - но подумал, что стоит сначала изучить.
Заранее спасибо