【问题标题】:Best way to pass multiple data types传递多种数据类型的最佳方式
【发布时间】:2013-01-22 17:15:57
【问题描述】:

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

有什么想法或好的方法吗?

【问题讨论】:

  • 只需使用字符并将所有内容恢复为应有的状态。
  • 谢谢!那可以工作。我会试一试(你能在答案中发布吗?)

标签: c++ plugins frameworks


【解决方案1】:

如果可以选择使用boost library,我强烈建议使用boost::any

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

【讨论】:

  • 我正在尝试减少我的插件库中的要求,但是谢谢,我会看看!
【解决方案2】:

您可以使用字符并将它们转换为几乎任何东西。对于无法通过简单转换“获取”的数据类型,我建议使用 memcpy()。

【讨论】:

  • 你能发布一个例子来说明你的意思吗?这是对您的响应的一种解释,它可能会破坏内存并且在 C++ 中并不总是按预期工作:int i1 = 0x7FFFFFFF; /*max value of signed 32-bit int*/ char* c = new char(); /*char is 8 bits on most systems*/ memcpy(c,&i1,sizeof(i1)); /*trying to fit four 8-bit bytes into 1 byte*/ int i2 = *c; /* casting back to int */ printf("%s",(i1 == i2 ? "TRUE" : "FALSE")); /*should print TRUE if i1 and i2 are equal as intended, but it does not*/。如果没有示例,我将投反对票,因为您的回答可能具有误导性。
  • 对于初学者,您不能将 32 位值放入 8 位数据类型中。您将不得不使用一个 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")); /*打印为真*/'
【解决方案3】:

在您的设计中使用模板和其他通用编程技术。

这是模板的入门: http://www.cplusplus.com/doc/tutorial/templates/

最推荐使用 boost any,但从设计的角度来看,我认为比当前接受的答案更好的替代方法(如果你想最小化依赖关系)是以下非常简单的模板包装器实现,它接受并返回任何类型:

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 对象中,然后再将其添加到队列中。您当然可以通过重载各种赋值运算符来稍微修饰一下,并使使用更加简单。

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 2017-07-24
    • 1970-01-01
    • 2014-10-11
    • 2016-12-03
    • 1970-01-01
    • 2015-12-28
    • 2023-03-12
    • 2015-07-04
    相关资源
    最近更新 更多