【问题标题】:Correct C++ approach to store multi-type data正确的 C++ 方法来存储多类型数据
【发布时间】:2019-08-23 13:41:33
【问题描述】:

假设我有 4 个字节来描述一些真实的系统参数。假设可以解释为浮点数、uint32_t 和布尔值。将这些变量存储和处理在一起的主要思想。现在我使用一个类(非常简化)有 4 个字节的数组,函数float toFloat()uint32_t toInt()bool toBool() 和参数 ID(它指定存储值类型)。所以我需要一个函数T getValue(),它将返回正确类型T 的值。所以我的问题是:最正确的方法是什么?我应该使用模板、继承、它的组合还是其他方式?

【问题讨论】:

  • std::variant<float, uint32_t, bool> 可能会有所帮助。
  • 你不能从同一个函数返回不同的类型。如果您在编译时知道您期望什么类型,那么模板可以提供帮助,但否则无法拥有“一个函数T getvalue(),它将返回正确类型的值T”。您存储该值的变量的类型是什么?它必须在编译时知道。 std::variant 提供了一种解决方法,但它非常冗长。
  • @MaxLanghof 是的,我明白了,所以我尝试使用模板。即使我创建了像 a = common(2), b = common(3.14) 这样的对象,我是否可以使用某种机制在没有类型指向的情况下获取值?像 a.getValue() 而不是 b.getValue().
  • @Stanislav x = a.getValue() 有什么类型?编译器必须在编译时决定 one 类型。如果你不能在编译时告诉编译器类型,你将无法编译你的程序。如果您确实在编译时知道类型并且只是想避免键入,则隐式转换可能会有所帮助(但您通常应该远离它们)。
  • @Stanislav 直接循环不同类型的变量是不可能的(我假设你的意思是getValue 会在不同的循环迭代中返回不同的类型)。 std::variant + std::visit 可以带你到那里。无论如何,请添加代码来演示您打算如何使用它。

标签: c++ templates inheritance data-storage


【解决方案1】:

你可以使用std::variant:

std::variant<float, uint32_t, bool> bytes(3.1415);

【讨论】:

  • variant 可能是 OP 应该使用的,但我不确定这是否是他们真正的意思。它说“我有 4 个字节 (...) 可以解释为浮点数、uint32_t 和布尔值” - 所以相同的四个字节可以解释为不同的东西吗? (可能只是类中的模板方法)。
  • 感谢您的回答,这是将字节转换为变量的好方法,但我的问题不仅仅是转换。我想仅基于使用此值存储的值类型来获取存储值。例如。我有温度(浮点数)、测量次数(uin32_t)和传感器状态(布尔值)。比我想为每种情况获取三个变量并获取这些值而不使用直接指向这种类型,就像它在 'std::variant' 中假设的那样
  • @Stanislav 那么你应该把它作为一个新问题来问。
【解决方案2】:

这似乎是工会的完美用例。唯一不妥的是,在联合中您不知道存储了哪种值类型。您可以附加类型信息,例如允许使用设置类型的访问器访问联合成员,或者如果您有任何其他方式知道可以使用的类型。

【讨论】:

  • Paul Evans 的回答更好。
  • @Oblivion 现在是 2019 年,你不想在 C++ 中使用 union
  • @Oblivion 那么作为一个坏例子?可能更好地教新手正确的开始方式。
  • @PaulEvans 也适用于我们这些必须维护旧代码的人。事实是工会会存在一段时间。而对于新的代码联盟 IMO 是一个错误
  • 这个用例与类型双关无关。
【解决方案3】:

数组必须具有唯一的数据类型,否则您必须使用多个数组联合构建并行数组结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2020-01-25
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多