Chức năng sau đây áp dụng một functor trên mỗi phần tử và làm giảm giá trị trả về:Iterator-giảm mẫu cho các chức năng có thể có hoặc không có thể trả về một giá trị
template <class FCT, class RED>
RED::TYPE forAllElements(FCT functor, RED reducer){
for(/* all elem in elements */){
reducer(functor(elem));
}
return reducer.value;
}
Bây giờ, thỉnh thoảng tôi có thể muốn chỉ cần gọi functor
trên tất cả các yếu tố, và không làm giảm bất cứ điều gì. Về cơ bản, tôi thì muốn có cái gì đó như:
class FunctorThatReturnsNothing{
void operator() (Elem e){
// do something, return nothing...
}
}
class DummyReducer{
using TYPE = void; // ??? something like that ???
template <class FCT>
void operator() (/* ??? what here */){
// do nothing...
}
}
forAllElements(FunctorThatReturnsNothing(), DummyReducer());
Nhưng điều đó sẽ không biên dịch kể từ khi tôi có reducer(functor(elem))
nơi giá trị trả về không tồn tại của một hàm khoảng trống được thực hiện như là một cuộc tranh cãi.
Có cách nào để làm cho nó hoạt động cho functors void mà không nhân đôi choAllElements cho một void
và một trường hợp không void
?
(Đối với những người nghi ngờ XY-Problem: về cơ bản tôi biết các cách tiếp cận khác nhau để lặp và giảm và tôi nghĩ rằng cách tiếp cận gọi lại được trình bày phù hợp với trường hợp của tôi. Tôi tự hỏi làm cách nào để tránh mã trùng lặp "return value + reduce" và trường hợp "just callback".)
Vì vậy, về cơ bản bạn muốn [ 'std :: for_each'] (http://en.cppreference.com/w/ cpp/algorithm/for_each)? –
@JoachimPileborg, xem phần cuối cùng của câu hỏi, trong ngoặc đơn. Tôi biết rằng tôi có thể đi con đường đó với vòng lặp, nhưng trong tình hình hiện tại, một giải pháp gọi lại như được trình bày là thuận lợi. – Michael
Cách tiếp cận sạch sẽ nhất là 'return reducer' thay vì' return reducer.value'. Bạn có thể cấu trúc lại mã của bạn để sử dụng nó không? – filipos