所以在C++中现在有make_from_tuple作为:
T obj = std::make_from_tuple<T>( { Args... args } ); // args represents a tuple
但我们该怎么做呢
T* obj = std::make_new_from_tuple<T*>( { Args... args } );
有make_shared和make_unique,但它们都不接受元组(我不确定如果这是要去的方向,如何从元组中提取参数,因为如果你想要原始指针,你总是可以make_unique然后释放)。
非常简单的例子1:
struct A
{
int i_; double d_; std::string s_;
A( int i, double d, const std::string& s ) : i_(i), d_(d), s_(s) {}
};
auto aTuple = std::make_tuple( 1, 1.5, std::string("Hello") );
对于一个更复杂的例子,如果元组包含一个您想要转发的unique_ptr,我也希望它能工作。
5条答案
按热度按时间polhcujo1#
基本上,您可以从cppreference的Possible implementation复制实现,然后将其插入
make_unique
中,这样就可以正常工作了:或使用原始指针:
qgzx9mmu2#
你可以使用
std::apply
。它从元组中解包参数并将它们传递给一个可调用对象。你只需要 Package 构造函数。为简洁起见,省略了完全转发。
hmtdttj43#
只需调用
new
即可:因为
make_from_tuple
返回一个纯右值,所以这将直接在堆中构造对象,而不需要复制或移动。6xfqseft4#
自C11/C14以来,显式使用
new
和delete
被认为是一种不好的做法。因此,建议使用std::make_unique
(C14)和std::make_shared
(C11)。https://godbolt.org/z/6zjTqK8f1
也许提供一些重载来处理移动语义会很好。
zzzyeukh5#
我能写的最简单的是: