W. *_*man 6 c++ pointers boost-any
假设我有一个类Handler,其中包含一些子类,如stringhandler,SomeTypeHandler,AnotherTypeHandler.Handler类将方法"handle"定义为所有子类的公共接口.对于不同的处理程序,"处理"的逻辑完全不同.
所以我需要做的是将任何值传递给handle方法.然后,特定类可以将"任何"转换为他们期望的类型.
基本上我需要的是像java类Object:D
我尝试的第一件事是void*,但显然你做不到B* someB = dynamic_cast<B*>(theVoidPointer),所以那里没有运气.
我的第二个想法是使用boost::any.但是,使用boost :: any的要求是该值必须是copy cunstructable,而我的数据不是这种情况.
有什么想法让这个工作?
谢谢
编辑:请注意,我知道我可以使用一个没有成员的SomeData类,并让我的数据成为其子类,但我正在寻找一种更通用的方法,它不需要我自己创建包装类.
好的,这是一个使用 boost::any 来保存指向数据类型的指针的简单方法。但是,请注意 boost::any 会增加一些开销代码,从而稍微降低性能(在大多数情况下可忽略不计)。考虑使用 boost::spirit::hold_any 代替,如果不需要类型安全,则考虑使用 void* 。
class Handler {
public:
void handle( boost::any value ) {
do_handle( value );
}
private:
virtual void do_handle( boost::any& value ) = 0;
};
template<class T>
class HandlerBase : public Handler {
private:
void do_handle( boost::any& value ) {
// here you should check if value holds type T*...
handle_type( *(boost::any_cast<T*>( value )) );
}
void handle_type( const T& value ) = 0;
};
class StringHandler : HandlerBase<std::string> {
private:
void handle_type( const std::string& value ) {
// do stuff
}
};
Run Code Online (Sandbox Code Playgroud)
现在,您可以编写大量从 HandlerBase 派生的处理程序类,而无需假设处理的类型具有公共基类。