可以返回同级对象的函数的自动返回类型

时间:2019-05-27 14:34:10

标签: c++ c++14 auto

我有两个从{"jasper"} {"526"} {"地理"} 类继承的类

Base

现在我要编写一个函数,该函数采用基类指针对象,并在动态强制转换后找到合适的子代并将其返回,以便我们可以调用正确版本的struct Base { virtual ~Base() = default; }; class Derived_1:public Base { public: void getSomeFunc(); }; class Derived_2:public Base { public: void getSomeFunc(); };

我试图写

getSomeFunc()

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

编辑1 ----------------------------------
编译器错误为-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!! } } 。 编译为incorrect deduction of 'auto'

1 个答案:

答案 0 :(得分:4)

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

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

然后,您可以编写:

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

在您的代码中,您试图让auto的类型为pq的类型为。但是auto仅具有单个类型。而且可以接受指向Derived_1的指针和指向Derived_2的指针的类型是……是的,您猜对了:Base*

编辑:如果您无法更改BaseDerived_1Derived_2类,则可以考虑使用std::variant<Derived_1*, Derived_2*>并使用访问以针对每种类型调用适当的方法。如果您以前没有使用过变体,请参见CPP-reference page on std::variant。有关如何编写用于变体的访问者的信息,请参见以下SO问题:

How does std::visit work with std::variant?