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

问题描述 投票:1回答:1

能否用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实现,还是需要在后台进行lexingparsing才能实现?

EDIT 这是否可以不使用 std::tie但使用(a,b)语法?

c++ c++14 c++17
1个回答
7
投票

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

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

注意到这一点 只是 适用于右侧的元组。你可以相当直接地将其扩展到原始数组上。但要让它适用于聚合则困难得多--在没有额外语言支持的情况下,你需要用到 魔法_获取 为的。


如果你真的想让:

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

工作,那么唯一的办法就是通过添加一个全局的 operator,()std::tie() 为你。

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);

但是,像... 不要这样做。

© www.soinside.com 2019 - 2024. All rights reserved.