Tôi cần tạo một hàm reduce
tương tự như std::reduce
, nhưng thay vì làm việc trên vùng chứa, chức năng này sẽ hoạt động trên các tham số variadic.Chuyển tiếp và trả về các kiểu trong chức năng giảm chức năng giống như
Đây là những gì tôi hiện có:
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)...);
}
Các công trình sau đây như mong đợi:
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
Nhưng sau không làm việc:
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});
này về cơ bản bị treo - Để thực hiện công việc này, tôi cần ví dụ thay đổi định nghĩa đầu tiên của reduce
thành:
template <typename F, typename T>
constexpr auto reduce(F&&, T &&t) {
return t;
}
Nhưng nếu tôi làm như vậy, đoạn mã đầu tiên sẽ không hoạt động nữa.
Vấn đề vấn đề nằm trong việc chuyển tiếp các tham số và kiểu trả về của hàm reduce
, nhưng tôi có thể tìm thấy nó.
Tôi nên sửa đổi các định nghĩa reduce
của mình để làm cho cả hai đoạn mã hoạt động như thế nào?
Hãy xem các biểu thức gấp C++ 17 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html – Snps