如何将"任何类型的数据"传递给C++中的函数

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类,并让我的数据成为其子类,但我正在寻找一种更通用的方法,它不需要我自己创建包装类.

fdl*_*dlm 1

好的,这是一个使用 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 派生的处理程序类,而无需假设处理的类型具有公共基类。