假设我有一个 Handler 类,它有一些子类,例如 stringhandler、SomeTypeHandler、AnotherTypeHandler。 Handler 类定义了一个方法“handle”作为所有子类的公共(public)接口(interface)。对于不同的处理程序,“处理”的逻辑当然是完全不同的。
所以我需要做的是将任何值传递给 handle 方法。然后特定的类可以将“任何东西”转换为他们期望的类型。
基本上我需要的是类似 java 类 Object 的东西 :D
我尝试的第一件事是 void*
, 但显然你不能做 B* someB = dynamic_cast<B*>(theVoidPointer)
,所以没有运气。
我的第二个想法是使用 boost::any
.然而,使用 boost::any 的要求是该值必须是可复制的,而我的数据不是这种情况。
有什么想法可以让它发挥作用吗?
谢谢
编辑:请注意,我知道我可以使用一个根本没有成员的 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
}
};
现在您可以编写大量从 HandlerBase 派生的处理程序类,而无需假设处理的类型具有公共(public)基类。
关于c++ - 如何将 "Any kind of data"传递给 C++ 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090822/