/* This testcase checks whether SWIG correctly uses the new result_of class and its templating capabilities introduced in C++11. */ %module cpp11_result_of %inline %{ #include typedef double(*fn_ptr)(double); %} namespace std { // Forward declaration of result_of template struct result_of; // Add in the required partial specialization of result_of template<> struct result_of< fn_ptr(double) > { typedef double type; }; } %template() std::result_of< fn_ptr(double) >; %inline %{ double square(double x) { return (x * x); } template typename std::result_of::type test_result_impl(Fun fun, Arg arg) { return fun(arg); } std::result_of< fn_ptr(double) >::type test_result_alternative1(double(*fun)(double), double arg) { return fun(arg); } %} %{ // Another alternative approach using decltype (not very SWIG friendly) std::result_of< decltype(square)&(double) >::type test_result_alternative2(double(*fun)(double), double arg) { return fun(arg); } %} %inline %{ #include void cpp_testing() { std::cout << "result: " << test_result_impl(square, 3) << std::endl; std::cout << "result: " << test_result_impl(square, 4) << std::endl; std::cout << "result: " << test_result_impl< fn_ptr, double >(square, 5) << std::endl; std::cout << "result: " << test_result_alternative1(square, 6) << std::endl; std::cout << "result: " << test_result_alternative2(square, 7) << std::endl; } %} %template(test_result) test_result_impl< fn_ptr, double>; %constant double (*SQUARE)(double) = square;