问题标签 [structured-bindings]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
889 浏览

c++ - 对未知自定义结构的结构化绑定

精简版:

我希望能够将结构转换为元组。至少类型。在下面的代码中,convertToTuple函数不起作用,因为可变参数不能用于结构化绑定(据我所知)。关键是:auto& [values...] = value;

基本上,我需要一种将自定义结构的类型转换为元组的方法,该元组包含结构中的所有类型。例如:

详细问题:

我想创建一个模板化函数,它将一个类型或类型列表作为模板参数并生成一个纹理列表,每个纹理包含一个项目。另一个函数可以对纹理列表进行采样并将这些值打包在一起以返回相同的类型。例如,如果我有一个类型:

上面的代码只是我想要做的一个简单的例子,而不是我的实际代码。在这种情况下,将创建 2 个纹理,一个纹理将包含来自元组的两个 int,另一个将包含单个 int 类型。我的目的是将纹理处理隐藏在接口后面,在那里我可以将任意值(只要它由一些简单类型组成)存储在可以上传到 GPU 以供着色器使用的纹理中。只要我只使用 std::tuple 和 std::pair,它就可以工作,因为我可以从中提取类型:

当模板参数是自定义结构时,我希望能够做同样的事情。例如:

我不相信这甚至可能适用于当前的 C++ 标准,但基于结构化绑定,这似乎是可能的。我的想法是这样的:

就我而言,可变参数仅工作函数或模板参数。但是如果structToTuple函数可以工作,那将解决我的问题。

提前感谢您的帮助,伙计们!

更新:

我找到了解决问题的方法(不是通用解决方案): https ://github.com/Dwarfobserver/AggregatesToTuples/blob/master/single_include/aggregates_to_tuples.hpp

这个库的作者定义了一个结构到元组的转换,但它只有在结构的参数不超过 50 个时才有效。这在实践中解决了我的问题,尽管我仍然很好奇是否可以使用任意结构。

0 投票
3 回答
6306 浏览

c++ - 结构化绑定是否适用于 std::vector?

是否可以将结构化绑定与向量一起使用?

例如

不幸的是,上面的代码不起作用(在 GCC 下),但也许有一种不同的方式(使用结构化绑定)允许将向量的前三个值分配给三个变量。

0 投票
2 回答
1343 浏览

c++ - 具有 std::minmax 和右值的结构化绑定

std::minmax在使用结构化绑定时,我遇到了一个相当微妙的错误。似乎传递的右值并不总是像预期的那样被复制。最初我T operator[]() const在自定义容器上使用 a ,但它似乎与文字整数相同。

使用 GCC 8.1.1-O1 -Wuninitialized将导致0,0打印为第一行,并且:

Clang 6.0.1 at-O2也会给出错误的第一个结果而没有警告。

-O0GCC 给出了正确的结果并且没有警告-O1对于 clang,结果在或处似乎是正确的-O0

在右值仍然可以被复制的意义上,第一行和第二行不应该是等价的吗?

另外,为什么这取决于优化级别?特别令我惊讶的是 GCC 没有发出警告。

0 投票
2 回答
570 浏览

c++ - 为什么“const auto [x, y]”在绑定到引用类型时表现不如预期?

以下代码片段摘自cppref

我的问题在最后一行:

为什么 decltype(w) int& 而不是 const int&

0 投票
0 回答
58 浏览

c++ - 基于范围的 for 循环、自动、元组和结构化绑定

有没有办法通过省略容器的类型规范来使这个基于范围的 for 循环更加简洁?我不关心它的实际类型,只要它包含(数学而不是 C++)对或整数元组。下面的表格是最好的,但它不能编译:

编辑:

这个问题与基于 Range 的 over pair list不同,因为我使用结构化绑定。我不想使用firstget<0>访问。我在数学和常识中使用pairstd::pair ,而不是.

0 投票
2 回答
220 浏览

c++ - 返回本地对象的元组

如何利用结构化绑定和元组将对象返回到函数的本地?

在一个函数中,我正在创建相互引用的本地对象,并且我想在一个元组中返回这些对象,并在我调用函数时使用结构化绑定来识别它们。我目前有这个:

这不起作用,我收到一条错误消息,指出返回值不能转换为上述返回类型的元组。我不确定为什么会这样,因为类型与声明相匹配。

最终,我正在尝试创建一个方便的函数,这样每次我想创建一个新的所有者时,我都不必在函数中键入四行。这是我尝试使用结构化绑定使这更容易。

编辑:我应该注意,我希望最后一行中的绑定引用所有者内部的对象。所以,副本是不够的。

0 投票
0 回答
993 浏览

c++ - lambda 捕获结构化绑定

据我了解,C++17 不禁止 lambda 表达式捕获结构化绑定。以下内容被 接受gcc但被拒绝clang,但cppreference声称 lambda 无法捕获结构化绑定。

  1. 是否符合clanggcc不符合?

  2. cppreference 将行为标记为 C++17 的一部分是否错误?

0 投票
1 回答
1831 浏览

c++ - unordered_map 和引用上基于范围的 for 循环

在 std::unordered_map 上运行基于范围的 for 循环时,循环变量的类型似乎不使用引用类型:

MSVC 2017、gcc 8.2 和 clang 7.0.0 在这里都报告了一个失败的断言。将此反对 std::vector,其中断言不会失败,正如人们所期望的那样:

然而,在 MSVC 2017 和 gcc 8.2 上,修改局部变量r的循环都会产生明显的副作用:

例如,该程序将打印(忽略顺序):

我错过了什么?尽管局部变量不是引用类型,但这如何改变地图中的值?或者可能更恰当地说,为什么std::is_same看不到正确的类型,因为很明显它是一个引用类型?或者我是否会遗漏一些未定义的行为?

请注意,我确实在不使用结构化绑定的情况下重现了相同的问题,因此我将漂亮的代码保留在这里。 有关示例,请参见此处

0 投票
3 回答
970 浏览

c++ - 名称对或元组值的别名引用

在重组一些代码时,我在返回具有 2 个值的结构时遇到了一个“问题”。现在这些确实应该以记录的效果命名。后来我想使用tie,所以我将结构更改为继承std::pair并设置引用。现在这实际上工作正常,但您会注意到现在我的结构的大小为 24,而不是与这对相比只有 8。

可能显而易见的方法是更改​​为成员函数,但是对于这种情况来说,这也是太多的“样板”(然后它会变得更容易,tie以后不使用)。直接的 memcpy 是例如。一个元组是直前 UB。直接结构化绑定也不可行,因为变量已经在使用中。

我的问题是,不考虑可重用部分(并且考虑到大小不应超过 2 个整数),有什么更好或最少的代码解决方案?

更新:对于这种情况,我最终只是做了一个简单的结构并暂时保留返回。对于来到这里的其他用户,有一个库提案来提升似乎能够将任何结构转换为元组:https ://github.com/apolukhin/magic_get/

0 投票
1 回答
4577 浏览

c++ - 为什么结构化绑定在 struct 上不能按预期工作?

clang 7.0 (on Windows) 的错误信息:

为什么结构化绑定在 struct 上不能按预期工作?