Предположим, у меня есть абстрактный класс ("интерфейс") 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();
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей