通过转换函数后将对象推送到向量
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...));
我想插入一个转换函数(可能是 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...));