c++ - 如何将 "Any kind of data"传递给 C++ 中的函数

标签 c++ pointers boost-any

假设我有一个 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/

相关文章:

c++ - 如何从 C++ 执行 Matlab 脚本

java - 在 Ubuntu Linux 中查找 C/C++ 源代码的最佳工具是什么?

c++ - OpenMP 的扩展不佳(缓存争用?)

c++ - boost :任意分布的 vector

c++ - 异构HashMap c++

C++ 性能 : template vs boost. 任何

c++ - 在 CRTP 的基类中使用 `this` 作为指向派生类的指针

arrays - 下标值既不是数组也不是指针错误

c++ - 在 C++ 中转换指针?

c - 如何在 C 中使用 malloc() 分配结构数组?