Similar to this question, but instead of perfect forwarding member of an object, I would like to know how to perfect forwarding elements of an STL container, i.e. similar to
namespace detail {
template
using forwarded_type = std::conditional_t::value,
std::remove_reference_t&,
std::remove_reference_t&&>;
}
template
detail::forwarded_type forward_like(U&& u) {
return std::forward>(std::forward(u));
}
template
void g(Vector&& v, size_t i) {
f(forward_like(v[i]));
}
Demo. Using std::forward
in the implementation automatically prevents you from doing a dangerous forward of rvalue as lvalue.
For your actual use case
I'd like to create
vector
fromvector
,vector
, ...., where each elementT
is constructed fromU1, U2, ...
. Each array ofvector
could be either&
or&&
, and I'd like theUi
to be perfectly forwarded.
this becomes something like
template
std::vector make_vector(Vectors&&...vectors){
auto n = std::min({vectors.size()...});
std::vector ret;
ret.reserve(n);
for(decltype(n) i = 0; i < n; ++i)
ret.emplace_back(forward_like(vectors[i])...);
return ret;
}