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

Как реализовать в следующем коде абстрактный базовый класс в общем случае. Код упрощен из библиотеки, над которой я работаю. Так что явная реализация для 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);
}

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

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


person Felix Petriconi    schedule 08.10.2016    source источник


Ответы (1)


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

Прежде всего, я думаю, вам нужно определить 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]
 }
person max66    schedule 08.10.2016
comment
Эй, не могли бы вы сказать мне, в чем разница между: Foo2<T>... и Foo2<T...> (точки вне скобок и внутри скобок) - person Brandon; 09.10.2016
comment
@Brandon - это совершенно разные вещи; если вы пишете Foo2<T...>, вы объявляете один базовый класс Foo2<T0, T1, T2 /* etc*/> с sizeof...(T) параметрами шаблона; если вы пишете Foo2<T>..., вы объявляете sizeof...(T) базовых классов, Foo2<T0>, Foo2<T1>, Foo2<T2> /* etc */, с одним параметром шаблона каждый - person max66; 09.10.2016