C++: интерфейс без наследования

293
12 августа 2017, 03:51

Предположим, у меня есть абстрактный класс ("интерфейс") I1 и конкретный тип T:

struct I1 {
  virtual void M1() = 0;
  virtual ~I1();
};
struct T {
  virtual void M1();
  T(){};
  virtual ~T(){};
};

Есть функция f, принимающая I1.

void f(I1& i1) {
  i1.M1();
}

Как видно, у T есть виртуальный метод M1, полностью повторяющий сигнатуру I1.M1. При этом, T не наследуется от I1.

Вопрос возможно глупый, но тем не менее. Можно ли каким-либо образом конвертировать объект типа T в тип I1 и передать его в функцию f, чтобы внутри неё вызвался T.M1? Ответ "Нет, только через наследование" вполне приемлем.

Answer 1

Так можно сделать только если T будет наследником I1. Альтернативным вариантом будет использование шаблонной функции f, с ограничением на то, каким может быть принимаемый объект типа typename T. Ограничение лучше всего делать с помощью концептов, которых пока в языке нет. Поэтому делать их придётся с использованием различных техник метапрограммирования. Но не ясно, насколько Вам это реально нужно, т.к. в большом количестве случаев можно обойтись просто неограниченным T, который даст ошибку компиляции, если у него нет соответствующей функции. Т.е. вот такой простой вариант:

template <typename I>
void f(I& i) {
  i.M1();
}
READ ALSO
Разделение потока на порции данных

Разделение потока на порции данных

Все то, что функция send() посылает на хост, может разделиться на несколько отдельных порций данных, на прочтение каждой из которых нужен отдельный...

195
Имена библиотек gcc

Имена библиотек gcc

Из литературы по С++ известны наименования библиотек (например, math)В линуксовском компиляторе gcc (а возможно и в g++) эта библиотека называется...

295
Приведение double к float в C++

Приведение double к float в C++

Пусть переменная типа double приводится к переменной типа floatЕсли переменная double хранит значение NaN, то оно преобразуется в NaN

347
libVLC Нужно ли вручную загружать библиотеки?

libVLC Нужно ли вручную загружать библиотеки?

Использую VLC SDK со статическими библиотеками, подгружаю вручную библиотеки libvlcdll, libvlccore

273