能否用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)语法?
当然,这个甚至已经存在于标准库中,作为 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);
但是,像... 不要这样做。