#include <iostream>

struct A
{
    template< typename FN, typename... ARGS >
    static void call( FN fn, ARGS... args ) { fn(args...) ; }
};

void foo( int a ) { std::cout << "foo(" << a << ")\n" ; }

int main()
{
    A::call( foo, 1 ) ;

    const auto bar = [] ( int a, double b )
    { std::cout << "main::bar(" << a << ',' << b << ")\n" ; } ;

    A::call( bar, 2, 3.4 ) ;
}
