【问题标题】:std::vector of <key-value> pairs with different types具有不同类型的 <key-value> 对的 std::vector
【发布时间】:2020-06-18 11:38:02
【问题描述】:

我正在尝试创建一个小型接口函数并将其发送到 JSON 格式化程序类。 JSON 仅适用于(无限)键值对,但值可以是(仅):string, int, bool

现在我有:

struct Data
{   
    std::vector<std::pair<std::string, int64_t>> intData;
    std::vector<std::pair<std::string, std::string>> strData;
    std::vector<std::pair<std::string, bool>> boolData;
};

void func(const Data& data);

但我不是很喜欢它(Data 中的 3 个几乎相似的结构),也许有更好的 C++ 方式。

对我来说,理想的情况是拥有一些(模板化的)更清洁的东西并像这样工作:

// pseudocode, I know that it does not work

struct Data
{   // AnyType = string, int or bool
    std::vector<std::pair<std::string, AnyType>> data;
};

// or better
using Data = std::vector<std::pair<std::string, AnyType>> data;

Data data;
data.add("int value", 1);
data.add("string value", "str");
data.add("bool value", false);

func(data);

谢谢

LE:我正在使用 C++11,很遗憾不能使用其他标准。

【问题讨论】:

  • std::variant&lt;std::int64_t, std::string, bool&gt; 呢?
  • 您也可以考虑使用std::any
  • 感谢大家的想法,尤其是@Evg。不幸的是我被 C++11 困住了,我会编辑我的帖子,所以std::variant 不是一个选项:(

标签: c++ c++11 std-pair


【解决方案1】:

想到的一个解决方案是使用std::variant 来获得编译时间 多态性,即:

std::vector< std::pair<std::string, std::variant<int64_t, std::string, bool>>>;

带有类型别名

using json_val = std::variant<int64_t, std::string, bool>;
std::vector< std::pair<std::string, json_val>>;

关于 json 和整体方法的说明:

如果您不需要在中间区分类型或者可能无法使用变体,则对所有值类型仅使用 std::string 可能会更简单。因为它是 json 这可能是有道理的,因为 json 数据格式没有像 int64_t 这样的类型,即。 json 只是有用字符串表示的数字。 (然后通过解析识别,我认为您正在尝试将其建模为中间格式)。

【讨论】:

  • std::variant 如果您以前从未见过它,那么正确使用它可能会非常棘手。我认为使用std::visitget_if的示例将有助于完成此答案。
  • @darune 好主意,不幸的是我被 C++11 困住了,std::variant 在 17 中。我将编辑我的第一篇文章以使其更加清晰。
  • @Taw Boost 有一个 variant 的实现,我相信它可以在 C++11 中工作。
  • @Taw,然后您可以使用union 和索引来模拟std::variant(在内部,std::variant 是带有索引的联合)。
  • @Taw 问题是哪个更好——使用一个额外的第三方库和一个经过充分验证的解决方案,或者自己编写。变体并不那么容易很好地实现,所以第二个选项最终可能会出现更多问题。
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2019-04-23
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多