#include #include #include #include template struct Multi { std::tuple d_tup; Multi(Types &&...types) : d_tup(std::forward(types)...) {} }; template struct Wrapper { mutable std::tuple d_cntxt; Result (*d_fun)(Opnd, std::tuple& ); Wrapper(Result fun(Opnd, std::tuple &), Cntxt &&...cntxt) : d_cntxt(std::forward(cntxt)...), d_fun(fun) {} Result operator()(Opnd &&opnd) const { return d_fun(std::forward(opnd), d_cntxt); } }; using namespace std; void handle(std::string const &str, tuple &tup) { ++get<0>(tup); get<1>(tup) << "Saw: " << str << '\n'; } int main(int argc, char **argv) { Multi multi{ 3, 12.5, 5 }; size_t count = 0; for_each(argv, argv + argc, Wrapper(handle, count, cout)); cout << "========> " << count << '\n'; cout << get<1>(multi.d_tup) << '\n'; }