Как реализовать абстрактный метод, когда абстрактный класс используется в вариационном контексте

Как реализовать в следующем коде абстрактный базовый класс в общем случае. Код упрощен из библиотеки, над которой я работаю. Так что явная реализация для int и double не вариант.

template <typename T>
struct Foo
{
virtual void send(T t) = 0;
};

template <typename...T>
struct Bar : Foo<T>...
{
void send(T t) override { // does not compile because
// abstract method not implemented
}
};

int main() {
// example usage
Bar<int, double> b;

b.send(1);
b.send(2.3);
}

Спасибо заранее.

редактировать: Добавлено виртуальное в абстрактный метод.

11

Решение

Как насчет следующего примера?

Прежде всего, я думаю, что вам нужно определить virtual send() метод в Foo (если вы хотите, чтобы это было чисто виртуально).

Далее вы можете объявить промежуточный класс шаблона (Foo2) где реализовать override send()

Наконец, вы можете использовать шаблон send() метод в Bar выбрать правильный виртуальный send() метод.

#include <iostream>

template <typename T>
struct Foo
{ virtual void send(T t) = 0; };

template <typename T>
struct Foo2 : Foo<T>
{
void  send(T) override
{ std::cout << "sizeof[" << sizeof(T) << "] " << std::endl; }
};

template <typename...T>
struct Bar : Foo2<T>...
{
template <typename U>
void send (U u)
{ Foo2<U>::send(u); }
};

int main()
{
Bar<int, double> b;

b.send(1);    // print sizeof[4]
b.send(2.3);  // print sizeof[8]
}
6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector