| /* This testcase checks whether SWIG correctly uses the new result_of class |
| and its templating capabilities introduced in C++11. */ |
| %module cpp11_result_of |
| |
| // std::result_of is deprecated in C++17 |
| // Replace std implementation with a simple implementation in order to continue testing with C++17 compilers and later |
| |
| %inline %{ |
| typedef double(*fn_ptr)(double); |
| %} |
| |
| %{ |
| #if __cplusplus >= 201703L |
| namespace std { |
| // Forward declaration of result_of |
| template<typename Func> struct result_of; |
| // Add in the required partial specialization of result_of |
| template<> struct result_of< fn_ptr(double) > { |
| typedef double type; |
| }; |
| } |
| #else |
| #include <functional> |
| #endif |
| %} |
| |
| namespace std { |
| // Forward declaration of result_of |
| template<typename Func> 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<class Fun, class Arg> |
| typename std::result_of<Fun(Arg)>::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); |
| } |
| %} |
| |
| %inline %{ |
| #include <iostream> |
| |
| void cpp_testing() { |
| std::cout << "result: " << test_result_impl(square, 3.0) << std::endl; |
| std::cout << "result: " << test_result_impl<double(*)(double), double>(square, 4.0) << std::endl; |
| std::cout << "result: " << test_result_impl< fn_ptr, double >(square, 5.0) << std::endl; |
| std::cout << "result: " << test_result_alternative1(square, 6.0) << std::endl; |
| } |
| %} |
| |
| %template(test_result) test_result_impl< fn_ptr, double>; |
| %constant double (*SQUARE)(double) = square; |