Say I have a tuple of types T1,...,TN that implement some method, apply() . How do I define a function that takes this tuple and some initial element, and returns the chained call of apply() on this element? For example: template <typename... Args, typename Input> auto apply(std::tuple<Args...> const &tpl, Input x) { // return ??? } // simple example struct Sqr { static int apply(int x) { return x * x; } }; enum class Choice { One, Two, }; struct Choose { static int apply(Choice choice) { switch (choice) { case Choice::One: return 1; case Choice::Two: return 2; } } }; void test() { auto tpl = std::tuple(Sqr{}, Choose{}); assert(apply(tpl, Choice::One) == 1); assert(apply(tpl, Choice::Two) == 4); } I tried to use fold expressions , and variations of answers from: Template tuple - calling a function on each element but couldn't get anything to compile. The main difference is that I need each invocation...