#include <iostream>
using namespace std;
class Base
{
public:
void who()
{
cout << "I am " << _name << endl;
}
protected:
std::string _name;
};
class A : public Base
{
public:
A()
{
_name = "A class";
}
};
class B : public Base
{
public:
B()
{
_name = "B class";
}
};
class Wrapper
{
public:
Wrapper(Base *i):_data(i)
{
}
operator A()
{
A a;
// dynamic_cast<A*>(_data);
return a;
}
operator B()
{
B a;
// dynamic_cast<B*>(_data);
return a;
}
private:
Base* _data;
};
void madeForClass(A iObject)
{
cout << "call madeForClass A";
}
void madeForClass(B iObject)
{
cout << "call madeForClass B";
}
int main()
{
A a;
Base* b = &a;
madeForClass(Wrapper(b));
return 0;
}
当我执行这个时,我从编译中得到错误说: 错误错误:重载“madeForClass(Wrapper)”的调用不明确 我知道即使我重载了类型转换,它也无法推断出正确的功能。但是,我怎样才能获得这样的活力呢?
有关更多信息,我想以某种方式在重载函数中或某处使用 dynamic_cast,以便根据转换的结果选择相应的 madeForClass 函数。
对于给定的示例,“B”的转换将失败,因此应该调用 madeForClass(A i);
最佳答案
或者,你可以这样做
class Wrapper
{
public:
Wrapper(Base *i) : _data(i) {}
template <typename F>
auto Apply(F f)
{
if (auto a = dynamic_cast<A*>(_data)) {
f(*a);
} else if (auto b = dynamic_cast<B*>(_data)){
f(*b);
}
}
private:
Base* _data;
};
然后
Wrapper(base).Apply([](const auto& e){ madeForClass(e); });
或使用 Visitor 而不是手动 dynamic_cast
关于c++ - 通过覆盖类型转换动态调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859667/