在 C++14 中手动实现结构化绑定

Manually implement structured binding in C++14

本文关键字:实现 结构化 绑定 C++14      更新时间:2023-10-16

是否可以使用 C++14 实现 C++17 结构化绑定? 我使用以下语法进行简单的概念证明:

int a,b;
(a,b)=std::tuple<int,int>(4,2);

我想象的方式是:

template <typename T, typename U>
operator=(operator()(T a, U b), std::tuple<T,U>(x,y))

因此,=接收一个左边的"捆绑元组",并将右元组分配给它。

这甚至可能吗? - 它是否可以使用 C++14 实现,或者是否需要在后台进行词法/解析才能启用它?

编辑这是否可以不使用std::tie,而是使用 (a,b( 语法?

当然。这甚至已经存在于标准库中,std::tie()

std::tie(a, b) = std::make_tuple(4, 2);

请注意,这仅适用于右侧的元组。您可以相当直接地将其扩展为适用于原始数组。但是让它为聚合工作要困难得多 - 如果没有额外的语言支持,你需要magic_get。


如果你真的想要:

(a, b) = std::make_tuple(4, 2);

要工作,那么唯一的方法基本上是通过添加一个为你std::tie()的全局operator,()来垃圾你拥有的所有其余代码:

template <typename T, typename U>
auto operator,(T& t, U& u) { return std::tie(t, u); }
template <typename... T, typename U>
auto operator,(std::tuple<T&...> t, U& u) { return std::tuple_cat(t, std::tie(u)); }

因此:

(a, b) = std::make_tuple(4, 2);

本身转换为:

std::tie(a, b) = std::make_tuple(4, 2);

但就像...别这样。