Предположим, у меня есть абстрактный класс ("интерфейс") 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
? Ответ "Нет, только через наследование" вполне приемлем.
Так можно сделать только если T
будет наследником I1
. Альтернативным вариантом будет использование шаблонной функции f
, с ограничением на то, каким может быть принимаемый объект типа typename T
. Ограничение лучше всего делать с помощью концептов, которых пока в языке нет. Поэтому делать их придётся с использованием различных техник метапрограммирования. Но не ясно, насколько Вам это реально нужно, т.к. в большом количестве случаев можно обойтись просто неограниченным T
, который даст ошибку компиляции, если у него нет соответствующей функции. Т.е. вот такой простой вариант:
template <typename I>
void f(I& i) {
i.M1();
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Все то, что функция send() посылает на хост, может разделиться на несколько отдельных порций данных, на прочтение каждой из которых нужен отдельный...
Из литературы по С++ известны наименования библиотек (например, math)В линуксовском компиляторе gcc (а возможно и в g++) эта библиотека называется...
Пусть переменная типа double приводится к переменной типа floatЕсли переменная double хранит значение NaN, то оно преобразуется в NaN
Использую VLC SDK со статическими библиотеками, подгружаю вручную библиотеки libvlcdll, libvlccore