がstd::apply
の可能な実装を検討:パラメータの組を持つ関数(f
)を呼び出すときに渡すために、なぜ我々は、実装にタプルstd::get<I>(std::forward<Tuple>(t))...
の各要素に対してstd::forward
を実行する必要はありません(t
)std :: forwardは明示的なstd :: forwardなしのパラメータをどのように適用しますか?
namespace detail {
template <class F, class Tuple, std::size_t... I>
constexpr decltype(auto) apply_impl(F &&f, Tuple &&t, std::index_sequence<I...>)
{
return std::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...);
}
} // namespace detail
template <class F, class Tuple>
constexpr decltype(auto) apply(F &&f, Tuple &&t)
{
return detail::apply_impl(
std::forward<F>(f), std::forward<Tuple>(t),
std::make_index_sequence<std::tuple_size_v<std::decay_t<Tuple>>>{});
}
を?
nice!つまり、魔法はタプルの側にあります:) –
@ W.F。正確に;) – Holt
'get'' std :: tuple&'を渡し、 'get'の後に、結果の要素を転送するのはどうでしょうか?それは同じように働くでしょうか? –