auto return 可以 return 兄弟对象的函数类型
auto return type of a function which can return an object of sibling
我有两个 class 继承自 class Base
struct Base
{
virtual ~Base() = default;
};
class Derived_1:public Base
{
public:
void getSomeFunc();
};
class Derived_2:public Base
{
public:
void getSomeFunc();
};
现在我想写一个函数,它接受基础 class 指针对象并在动态转换后找到合适的子对象和 returns 它以便我们可以调用 [=15= 的正确版本]
我试着写
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
这几乎肯定不是您想做的。相反,使用虚拟方法:
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*
.
编辑:如果你无法更改Base
、Derived_1
和Derived_2
class,你可以考虑使用 std::variant<Derived_1*, Derived_2*>
,并使用访问为每种类型调用适当的方法。如果您以前没有使用过变体,请参阅 CPP-reference page on std::variant
。有关如何编写用于变体的访问者的信息,请参阅此 SO 问题:
我有两个 class 继承自 class Base
struct Base
{
virtual ~Base() = default;
};
class Derived_1:public Base
{
public:
void getSomeFunc();
};
class Derived_2:public Base
{
public:
void getSomeFunc();
};
现在我想写一个函数,它接受基础 class 指针对象并在动态转换后找到合适的子对象和 returns 它以便我们可以调用 [=15= 的正确版本]
我试着写
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
这几乎肯定不是您想做的。相反,使用虚拟方法:
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*
.
编辑:如果你无法更改Base
、Derived_1
和Derived_2
class,你可以考虑使用 std::variant<Derived_1*, Derived_2*>
,并使用访问为每种类型调用适当的方法。如果您以前没有使用过变体,请参阅 CPP-reference page on std::variant
。有关如何编写用于变体的访问者的信息,请参阅此 SO 问题: