从一个通过函数获取的元组中,能否在成员初始化列表中初始化多个成员?
随着通过元组返回多个值变得越来越流行,我希望有一个解决方案。我认为这是可能的,除了语言限制以外没有其他原因。
下面是我所拥有的 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
)。
如此处所述,C++1z
将具有结构化绑定(D0144R0),从而使以下操作成为可能:
auto {x,y,z} = f();
由于我没有找到完整的论文,所以无法确定这是否有助于成员初始化列表的上下文。 我怀疑不会。