通过转换函数后将对象推送到向量

push object to vector after passing through conversion function

我想插入一个转换函数(可能是 std::function)来修改一个被推到 std::vector 上的对象。我希望对象就地构造,并通过函数而不构造额外的副本。

假设我正在这样做:

std::vector<foo> foo_array;

foo_array.push_back(foo(foo_construct_arguments...));

现在我想这样做:

foo_array.push_back(convert(foo(foo_construct_arguments...)));

其中 'convert' 是这样的:

std::function<foo &(foo&)> convert{ [&](foo &f)->foo& { return f; } }

显然,该函数必须修改 f 才能发挥作用,但在最简单的情况下,我们可以说它只是 returns 对象。

我想以如下所示的语法结束:

foo_array.emplace_back(convert(foo(foo_construct_arguments...)));

并构造一个 foo 实例,由 convert 函数修改,然后仅使用一个构造将其放置在向量中。似乎应该有某种方法可以在适当的位置指定 r 值引用来实现这一点,但我对移动语义等还不够熟悉,无法实现它。一路上我可以找到到达那里的方法。

这里需要的语法是:

std::function<foo&&(foo&&)> convert{[](foo&& f) -> foo&& { return std::move(f); } };

或者,完全通用的 lambda fn:

auto fn = [](auto&& f) -> decltype(auto) { return std::forward<decltype(f)>(f); };
std::function<foo&&(foo&&)> convert{fn};

如果此代码位于热路径上,您可能希望尽可能避免将 lambda 包装到 std::function 中。


或者,emplace_back returns 对新元素的引用,然后您可以使用它来修改元素 in-place:

std::vector<foo> foo_array;
std::function<void(foo&)> convert{...};
convert(foo_array.emplace_back(foo_construct_arguments...));