C++ Utilizzo di un oggetto oggetto Consumer


Esempio

Siamo in grado di fornire un consumatore che verrà chiamato con i molteplici valori rilevanti:

C ++ 11
template <class F>
void foo(int a, int b, F consumer) {
    consumer(a + b, a - b, a * b, a / b);
}

// use is simple... ignoring some results is possible as well
foo(5, 12, [](int sum, int , int , int ){
    std::cout << "sum is " << sum << '\n';
});

Questo è noto come "continuation passing style" .

È possibile adattare una funzione che restituisce una tupla in una funzione di stile a passaggio continuo tramite:

C ++ 17
template<class Tuple>
struct continuation {
  Tuple t;
  template<class F>
  decltype(auto) operator->*(F&& f)&&{
    return std::apply( std::forward<F>(f), std::move(t) );
  }
};
std::tuple<int,int,int,int> foo(int a, int b);

continuation(foo(5,12))->*[](int sum, auto&&...) {
  std::cout << "sum is " << sum << '\n';
};

con versioni più complesse essendo scrivibili in C ++ 14 o C ++ 11.