автоматический возврат типа функции, которая может вернуть объект родного - PullRequest
1 голос
/ 27 мая 2019

У меня есть два класса, которые наследуются от класса Base

struct Base
{
   virtual ~Base() = default;
};

class Derived_1:public Base
{
  public:
     void getSomeFunc();
};

class Derived_2:public Base
{
  public:
     void getSomeFunc();
};

Теперь я хочу написать функцию, которая принимает объект-указатель базового класса и после динамического приведения находит соответствующий дочерний элемент и возвращает его такчто мы можем назвать правильную версию getSomeFunc()

Я пытался написать

auto getChild(Base* ptr)
{
  Derived_1 * p = dynamic_cast<Derived_1*>(ptr)
  if(p)
  {
    return p;
  }
  else
  {
      Derived_2 * q = dynamic_cast<Derived_2*>(ptr)
      if(q)
      {
        return q;
      }
     else
     { 
        // some handling to avoid bugs!!
     }
  }

Но он не компилируется.Любой способ удовлетворить мое требование.

Редактировать 1 ----------------------------------
Ошибка компилятора - incorrect deduction of 'auto'.Компиляция gcc

1 Ответ

4 голосов
/ 27 мая 2019

Это почти наверняка не то, что вы хотите сделать. Вместо этого используйте виртуальный метод:

class Base {
public:
    virtual void getSomeFunc() = 0;
    // ... etc etc ...
};

тогда вы можете написать:

Base* ptr = get_a_base_instance_ptr_from_somewhere();
ptr->getSomeFunc();

В вашем коде вы пытались иметь auto иметь либо типа p или типа q. Но auto имеет только одиночный тип. И тип, который может принимать как указатель на Derived_1, так и указатель на Derived_2, это ... да, вы уже догадались: Base*.

edit: Если вы не можете изменить класс Base, Derived_1 и Derived_2, вы можете рассмотреть возможность использования std::variant<Derived_1*, Derived_2*> и использования посещения для вызова соответствующего метода для каждого из эти типы. Если вы ранее не использовали варианты, см. Справочную страницу CPP на std::variant. Для получения информации о том, как написать посетителя для использования с вариантом, см. Этот вопрос SO:

Как работает std :: visit с std :: option?

...