2013-01-22 38 views
2

我正在编写一个插件框架,该插件应该将数据传递给应用程序,我创建了一个插件放入数据的队列,但我希望插件可以传递多个数据类型(int,bool,char,...),而不仅仅是一个。传递多种数据类型的最佳方式

任何想法或任何好办法做到这一点?

+1

只需使用字符并将所有内容都转换回它应该是的。 – Kevin

+0

谢谢!这可以工作。我会试一试(你可以将它发布在答案中吗?) – Spamdark

回答

1

你可以使用字符并将它们转换为任何东西。对于数据类型,您不能通过简单的转换“进入”,我建议使用memcpy()。

+0

你可以发表你的意思吗?下面是对你的响应的一种解释,它可能会破坏内存,并不总是按照C++的预期工作:'int i1 = 0x7FFFFFFF;/*有符号32位int的最大值*/char * c = new char();/*在大多数系统上char是8位*/memcpy(c,&i1,sizeof(i1));/*试图将四个8位字节放入1字节*/int i2 = * c;/*转回到int */printf(“%s”,(i1 == i2?“TRUE”:“FALSE”));/*应打印真如果i1和i2是相等的意图,但它不* /'。没有一个例子,我会投票,因为你的回应可能会误导你。 – statueuphemism

+0

对于初学者,您无法在8位数据类型中使用32位值。你将不得不使用一个char数组来适应int。 'int i1 = 0x7FFFFFFF;/*有符号32位int的最大值*/ char c [sizeof(int)];/* char在大多数系统上是8位*/ memcpy(&c [0],&i1,sizeof(i1));/*尝试将四个8位字节装入1个字节*/ int * i2 =(int *)c;/*返回int */ printf(“%s”,(i1 == * i2?“TRUE”:“FALSE”));/*打印真实* /' – Kevin

5

如果使用boost library是一种选择,我会强烈建议使用boost::any

boost::any a(1234567); 
boost::any b(12.3456); 
boost::any c(12345LL); 
boost::any d(true); 
+0

我试图减少我的插件库中的需求,但是谢谢,我会看看! – Spamdark

1

使用模板和其他通用编程技术为您的设计的一部分。

这里有一个模板首发: http://www.cplusplus.com/doc/tutorial/templates/

使用Boost任何最推荐的,但我认为一个替代方案是从设计的角度来看比目前公认的答案更好(如果你希望尽量减少依赖)是以下非常简单的实现,它接受和返回任何类型的模板包装的:

class IAnyType {} 

template <class T> 
class AnyType : public IAnyType 
{ 
private: 
    T value_; 
public: 
    AnyType(T value) : value_(value) {} 

    void set(T value) { value_ = value; } 

    T get() { return value_; } 
}; 

然后,只需让你的队列保持IAnyType对象并将其添加到队列之前ANYTYPE对象内的所有参数存储。通过重载各种赋值操作符,使得用法更简单,你当然可以修改这一点。

相关问题