成员变量的结构化绑定

时间:2018-06-21 07:01:21

标签: c++ tuples c++17

在Visual Studio 2017中,打开/std:c++17后,我可以完成

auto [d1, d2] = func_return_tuple();

,其中func_return_tuple()返回两个双精度值的元组。

但是,如果类A有两个成员变量d1_d2_,我就不能这样做

A a;
auto [a.d1_, a.d2_] = func_return_tuple();

有没有出路?

当然

std::tie(a.d1_, a.d2_) = func_return_tuple();

始终有效。

1 个答案:

答案 0 :(得分:2)

  

有没有出路?

基本上没有。结构化绑定仅与将对象分解为组成元素有关。它总是引入 n 个新名称-每个元素一个。您不能通过结构化绑定进行分配,也不能使用它来重新绑定现有名称或类似名称。

您的选择基本上是:

std::tie(a.d1_, a.d2_) = func_return_tuple();

或者,假设A是包含这两个成员的聚合,则类似:

template <typename T>
struct list_init_t {
    template <typename... Args>
    T operator()(Args&&... args) const {
        return T{std::forward<Args>(args)...};
    }
};

template <typename T>
inline constexpr list_init_t<T> list_init;

用作:

a = std::apply(list_init<A>, func_return_tuple());