可以返回兄弟对象的函数的自动返回类型

gau*_*waj 1 c++ auto c++14

我有两个从类继承的类 Base

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

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

class Derived_2:public Base
{
  public:
     void getSomeFunc();
};
Run Code Online (Sandbox Code Playgroud)

现在我想写一个函数,它接受基类指针对象并在动态转换后找到合适的孩子并返回它,以便我们可以调用正确版本的 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!!
     }
  }
Run Code Online (Sandbox Code Playgroud)

但它没有被编译。任何方式来满足我的要求。

编辑 1 ----------------------------------
编译器的错误是 - incorrect deduction of 'auto'。编译是gcc

ein*_*ica 5

这几乎肯定不是您想要做的。相反,使用虚方法:

class Base {
public:
    virtual void getSomeFunc() = 0;
    // ... etc etc ...
};
Run Code Online (Sandbox Code Playgroud)

那么,你可以写:

Base* ptr = get_a_base_instance_ptr_from_somewhere();
ptr->getSomeFunc();
Run Code Online (Sandbox Code Playgroud)

在你的代码,你想有auto两种类型p或类型q。但是,auto只有一个单一的类型。并且可以接受指向Derived_1和指向的指针的类型Derived_2是...是的,您猜对了:Base*.

编辑:如果您无法更改Base,Derived_1Derived_2类,您可以考虑使用std::variant<Derived_1*, Derived_2*>, 并使用访问为这些类型中的每一种调用适当的方法。如果您之前未使用过变体,请参阅 上的CPP 参考页面std::variant。有关如何编写用于变体的访问者的信息,请参阅此 SO 问题:

std::visit 如何与 std::variant 一起使用?