Dynamic_cast к любому из нескольких вариантовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Dynamic_cast к любому из нескольких вариантов

Сообщение Anonymous »

Что-то похожее на этот вопрос, у меня есть что-то вроде этого:

Код: Выделить всё

class DerivedA: public Base
{
void operation(const Base& x, const Base& y) override // pure virtual in Base
{
const DerivedA& xd = dynamic_cast (x);
const DerivedA& yd = dynamic_cast (y);

xd.some_method();
yd.some_method();
}
};
Идея состоит в том, что эта операция определяется только тогда, когда входные данные являются обоими DerivedA, поскольку some_method реализован только в DerivedA и не обязательно в других производных Base.
Но я хочу слегка обобщить это, чтобы позволить x и y иметь либо DerivedA, либо DerivedB, потому что теперь и DerivedA, и DerivedB реализуют some_method.
Один, казалось бы, ужасный способ сделать это, аналогичный связанному вопросу, заключается в следующем:

Код: Выделить всё

class DerivedA: public Base
{
void operation(const Base& x, const Base& y) override // pure virtual in Base
{
const DerivedA& xda = dynamic_cast (x);
const DerivedB& xdb = dynamic_cast (x);

const DerivedA& yda = dynamic_cast (y);
const DerivedB& ydb = dynamic_cast (y);

if (xda != NULL && yda != NULL)
{
// use xda and yda
}
else if
// repeat same code...
// try all the combinations...
}
}
Есть ли лучший способ разрешить приведение к одному из двух вариантов?
В качестве альтернативы, лучше ли попытаться проверить, существует ли some_method в объектах x и y, и в противном случае выдать ошибку? Кажется, это тоже довольно сложно.
Я пытался сделать операцию в DerivedA шаблоном, шаблоном , но поскольку предполагается, что он переопределяет чистый виртуальный элемент в Base, я получаю ошибки, сообщающие, что функция никогда не реализуется.

Подробнее здесь: https://stackoverflow.com/questions/798 ... al-options
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»