AFl*_*Car 5 c++ oop reflection polymorphism
我正在尝试一个项目,它需要我在运行时确定多态对象的类型,以便我可以投射它.我的意思的一个例子:
class A{
};
class B: public A{
public:
void foo(){
printf("B::foo()\n");
}
};
Run Code Online (Sandbox Code Playgroud)
稍后,我将有一堆B对象基本上存储如下:
std::vector<A*> v;
v.push_back(new B());
Run Code Online (Sandbox Code Playgroud)
我需要调用某些定义为的重载方法:
void bar(B* b){
b->foo();
}
Run Code Online (Sandbox Code Playgroud)
传入存储的对象后v.我遇到的问题是,在我的实际用例中,我不知道B编译时的类型,所以我不能只是bar通过说bar((B*)v.get(0));
我一直以为我可能需要的解决方案是以某种方式确定每个对象在运行时的类型,以便我可以在将它传递给它之前将其强制转换bar.
我到目前为止尝试的解决方案是使用decltype,但它对我不起作用,因为它只返回传入的值的静态类型,而不是运行时的类型.
此外,我不想在这个项目中使用第三方库,因为我希望尽可能小.
谢谢您的帮助.
编辑:
当我描述我的问题时,我认为我的意思并不清楚.在我的实际用例中(虽然我可以在这里发布,但是我可以发布它的部分内容有点长),我正在尝试编写一个库,其中有一个基类(在此表示为A),可以扩展由用户进入自己的自定义类(此处表示为B).在我的例子中,B::foo()简单地应该表示每个子类如何A拥有自己的数据成员,稍后由某种方法处理(在我的例子中表示为bar).这也是为什么A不能简单地拥有一些虚拟foo方法的原因.
我遇到的主要问题是,因为B应该是用户定义的,我不知道它在编译时是什么,但我在链接时做(因为链接后来).这就是为什么dynamic_cast(正如Sam和Remy所建议的)的使用不起作用的原因,因为根据我的理解,它要求我知道什么是B可能的,但我不知道.虽然它看起来非常接近可能对我有用的东西.如果有某种方法可以获得所有可能的子类(例如,使用预处理器宏或模板),那么我认为这可能会起作用.
我希望这次我能更好地解释它.再次感谢你的帮助.
编辑2:另一个澄清点:在我正在进行的实际项目中,我只希望用户需要编写自己的B类并重载bar以使用他们的自定义类.但是,我不希望要求用户打电话bar.相反,我希望bar从基类(我定义)中调用.这就是我尝试这样做的主要原因.那,并看看我能不能.
希望清除一切.再次感谢你.
我认为这对你有用。首先我们定义一个纯虚成员函数,call_bar以便我们可以在基类上调用它A。对于实现,我们需要正确的类型,但使用CRTP,用户类可以为我们指定它。
class A
{
public:
virtual void call_bar() = 0;
virtual ~A() {}
};
template <typename T>
class B : public A
{
public:
virtual void call_bar() override
{
bar(static_cast<T*>(this));
}
};
class C: public B<C>
{
};
Run Code Online (Sandbox Code Playgroud)