std::reduce
と似た関数reduce
を作成する必要がありますが、コンテナを操作する代わりに、この関数は可変パラメータに機能するはずです。機能的なreduce関数の転送型と戻り型
これは私が現在持っているものです。
template <typename F, typename T>
constexpr decltype(auto) reduce(F&&, T &&t) {
return std::forward<T>(t);
}
template <typename F, typename T1, typename T2, typename... Args>
constexpr decltype(auto) reduce(F&& f, T1&& t1, T2&& t2, Args&&... args) {
return reduce(
std::forward<F>(f),
std::forward<F>(f)(std::forward<T1>(t1), std::forward<T2>(t2)),
std::forward<Args>(args)...);
}
予想通り、次の作品:
std::vector<int> vec;
decltype(auto) u = reduce([](auto &a, auto b) -> auto& {
std::copy(std::begin(b), std::end(b), std::back_inserter(a));
return a;
}, vec, std::set<int>{1, 2}, std::list<int>{3, 4}, std::vector<int>{5, 6});
assert(&vec == &u); // ok
assert(vec == std::vector<int>{1, 2, 3, 4, 5, 6}); // ok
しかし、次は動作しません:
auto u = reduce([](auto a, auto b) {
std::copy(std::begin(b), std::end(b), std::back_inserter(a));
return a;
}, std::vector<int>{}, std::set<int>{1, 2},
std::list<int>{3, 4}, std::vector<int>{5, 6});
これは基本的にクラッシュする - へこの仕事をする、私は必要があるreduce
の最初の定義を変更します。
template <typename F, typename T>
constexpr auto reduce(F&&, T &&t) {
return t;
}
しかし、私はそうするならば、最初のスニペットはもう動作しません。
問題は、reduce
関数のパラメータと戻り値の型の転送にありますが、私はそれを見つけることができます。
reduce
の定義を変更して両方のスニペットを機能させるにはどうすればよいですか?
C++ 17の折り畳み式を見てください。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html – Snps