gpt4 book ai didi

c++ - 嵌套变体的简洁初始化语法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:31:03 25 4
gpt4 key购买 nike

我正在使用一个小型 C++ JSON 库来帮助提高我生疏的 C++ 技能,但我无法理解初始化列表的某些行为。

该库的核心是一个变体类(名为“var”),它存储各种 JSON 数据类型(空值、 bool 值、数字、字符串、对象、数组)。

var 的目标是尽可能接近 JavaScript 变量,因此需要大量运算符重载。原始数据类型很容易处理...

var fee = "something";
var fie = 123.45;
var foe = false;

问题出在对象( map )和数组( vector )上。

为了接近 JavaScript 对象和数组字面量语法,我使用了初始化列表。它看起来像这样:

// in my headers
typedef var object[][2];
typedef var array[];

// in user code
var foo = (array){ 1, "b", true };
var bar = (object){ { "name", "Bob" }, { "age", 42 } };

效果很好。问题来自嵌套列表。

var foo = (array){ 1, "b", (array){ 3.1, 3.2 } };

出于某种原因,我的变体类将嵌套的“数组”解释为 bool 值,给出:

[1, "b", true]

代替:

[1, "b", [3.1, 3.2]]

如果我明确地将内部列表转换为 var,它会起作用:

var foo = (array){ 1, "b", (var)(array){ 3.1, 3.2 } };

为什么我必须在将内部列表转换为数组后将其显式转换为 var,以及如何绕过这个额外的转换?据我所知,无论如何它都应该隐式地将数组转换为我的 var 类,因为它正在使用 vars 数组的构造函数:

template <size_t length>
var(const var(&start)[length]) {
// internal stuff
init();
setFromArray(vector<var>(start, start + length));
}

似乎在没有显式转换为 var 的情况下,初始化列表在从数组转换为 var 的过程中以某种方式转换为其他内容。我试图了解为什么会发生这种情况,以及如何避免这种情况。


这是 a gist与完整的来源。如果我应该添加与问题相关的任何内容,请告诉我。


更新

显然 (foo){1, "two"} 实际上并没有转换一个初始化列表;这是一个完整的表达式,称为 compound literal .它似乎只在 C 中可用,尽管 g++ 不会提示,除非你给它 -pedantic

看起来我的选择是:

  • 找到官方支持的另一种简洁的初始化语法。
  • 使用复合字面量并希望它们能在其他编译器中工作。
  • 放弃对 C++ < 11 的支持并使用 initializer_list。
  • 不要提供简洁的初始化语法。

第一个选项的任何帮助都是我此时正在寻找的答案。

宏是另一种不得已的选择,我已经编写了一些可以完成这项工作的宏,但我不想使用它们。

最佳答案

您需要使用 Boost 已经提供给您的设施。

typedef boost::optional<boost::make_recursive_variant<
float, int, bool, //.. etc
std::unordered_map<std::string, boost::optional<boost::recursive_variant_>>,
std::vector<boost::recursive_variant_>
> JSONType;

他们可以轻松定义递归变体类型。

关于c++ - 嵌套变体的简洁初始化语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com