我正在编写一个插件框架,该插件应该将数据传递给应用程序,我创建了一个插件放入数据的队列,但我希望插件可以传递多个数据类型(int,bool,char,...),而不仅仅是一个。传递多种数据类型的最佳方式
任何想法或任何好办法做到这一点?
我正在编写一个插件框架,该插件应该将数据传递给应用程序,我创建了一个插件放入数据的队列,但我希望插件可以传递多个数据类型(int,bool,char,...),而不仅仅是一个。传递多种数据类型的最佳方式
任何想法或任何好办法做到这一点?
你可以使用字符并将它们转换为任何东西。对于数据类型,您不能通过简单的转换“进入”,我建议使用memcpy()。
你可以发表你的意思吗?下面是对你的响应的一种解释,它可能会破坏内存,并不总是按照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
对于初学者,您无法在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
如果使用boost library是一种选择,我会强烈建议使用boost::any
:
boost::any a(1234567);
boost::any b(12.3456);
boost::any c(12345LL);
boost::any d(true);
我试图减少我的插件库中的需求,但是谢谢,我会看看! – Spamdark
使用模板和其他通用编程技术为您的设计的一部分。
这里有一个模板首发: 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对象内的所有参数存储。通过重载各种赋值操作符,使得用法更简单,你当然可以修改这一点。
只需使用字符并将所有内容都转换回它应该是的。 – Kevin
谢谢!这可以工作。我会试一试(你可以将它发布在答案中吗?) – Spamdark