c++ - 成员初始化列表 : initialize two members from a function returning a tuple

标签 c++ tuples c++14 c++17 initialization-list

member initializer list 中的多个成员是否可以从函数获得的元组中初始化?

随着通过元组返回多个值变得越来越流行,我希望有一个解决方案。除了语言限制,我看不出有什么其他原因无法做到这一点。


这是我所拥有的mcve:

auto new_foo(std::size_t size) -> std::tuple<std::unique_ptr<char[]>, int*>
{
    auto buffer = std::make_unique<char[]>(size * sizeof(int) + 8);
    auto begin = static_cast<int*>(static_cast<void*>(buffer.get() + 4));
    return std::make_tuple(std::move(buffer), begin);
}

struct X {
    std::unique_ptr<char[]> buffer_{nullptr};
    int* begin_{nullptr};
    std::size_t size_{0};

    X(std::size_t size) : size_{size}
    {
        std::tie(buffer_, begin_) = new_foo(size);
    }
};

这可以做到吗?:

    X(std::size_t size)
        : buffer_{ ??? },
          begin_{ ??? },
          size_{size}
    {
    }

我根本无法调用 new_foo每个成员初始化一次(因为它在每次调用时返回另一个元组)。所以

    X(std::size_t size)
        : buffer_{std:get<0>(new_foo(size)},
          begin_{std:get<1>(new_foo(size)},
          size_{size}
    {
    }

这是不可能的(即使不是这种情况,多次调用以获得相同的结果也不是最优的)

我想到的另一个解决方案是将成员保存为一个元组。我放弃了它,因为我需要在类中正确命名的两个成员并且不能使用 get<0> 访问和 get<1> .

另一种解决方法是创建一个简单的单独结构来保存这两个成员。这样他们就有了名字,但添加了另一个级别的限定符,可能我必须为它创建一个复制构造函数(因为 unique_ptr )。


据报道here C++1z将具有结构化绑定(bind) (D0144R0),这将使这成为可能:

auto {x,y,z} = f();

因为我没有找到完整的论文,所以我无法判断这是否有助于成员初始化列表。我怀疑不是。

最佳答案

定义另一个(可能是私有(private)的)构造函数,它接受元组并委托(delegate)给它。

  private:
    X(std::tuple<std::unique_ptr<char>, int*> t, std::size_t size)
            : buffer_{std::move(std:get<0>(t))},
              begin_{std:get<1>(t)},
              size_{size}
    { }

 public:
    X(std::size_t size) : X{new_foo(size), size}
    { }

关于c++ - 成员初始化列表 : initialize two members from a function returning a tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35352020/

相关文章:

c++ - 如何使用Qt检查webservice是否启动

c++ - 类中的 map<string, string>

C++ 更改打印队列所有者

python - 比较两个元组列表

c++ - boost::shared_ptr 使用次数

python - 如何将 pandas 数据框转换为具有聚合级别的嵌套命名元组

在 R 中对元组进行排序后删除重复的元组

C++ - 模板模板参数可以是变量或函数吗?

c++ - 类指针类和 ->* 运算符

c++ - std::greater<> 如何在集合中工作?