मुझे फ़ंक्शन std::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
परिभाषाओं को कैसे संशोधित करना चाहिए?
सी ++ 17 फोल्डिंग एक्सप्रेशन http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html – Snps