#include #include #include #include #include #include #include template< typename Function, size_t N = boost::function_type_arity::value > struct function_feeder; template struct function_feeder{ template< class Tuple > static typename boost::function_type_result< F >::type feed(F f, Tuple& ) { return f(); } }; template struct function_feeder{ template< class Tuple > static typename boost::function_type_result< F >::type feed(F f, Tuple& t) { return f(boost::get<0>(t)); } }; template struct function_feeder{ template< class Tuple > static typename boost::function_type_result< F >::type feed(F f, Tuple& t) { return f(boost::get<0>(t),boost::get<1>(t)); } }; template< class Function, class Tuple > typename boost::enable_if< ::boost::is_function_type, typename boost::function_type_result::type >::type feed_function(Function f, Tuple& t) { return function_feeder::feed(f,t); } // some simple function s to test bool is_less (double const & lhs , double const & rhs) { return lhs < rhs; } bool is_greater_than (double const & lhs , double const& rhs) { return lhs > rhs; } template< int N> double abs_diff(double const & in) { double t = in - N; return t >= 0 ? t : -t; } void hello_f() { std::cout << "hello\n"; } int main() { // create the wrapper struct to call the converted function BOOST_AUTO(args0,(boost::make_tuple(1.,2))); BOOST_AUTO(args1,(boost::make_tuple(20.))); std::cout << feed_function(is_less,args0)<< '\n'; std::cout << feed_function(is_less,args0)<< '\n'; std::cout << feed_function(abs_diff<200>,args1)<< '\n'; feed_function(hello_f, boost::make_tuple()); // any tuple of greter arity allowed feed_function(hello_f,args0); }