diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2013-02-01 19:17:21 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2013-02-01 19:17:21 +0000 |
commit | a043b55b69d4587a1bd95b934b85acb683e415e6 (patch) | |
tree | 2e8237d18d53a7af4f24b0d7039322eca6c6bbef | |
parent | 2a90cc6a9807c2cd136befaada1ff91276e7d01c (diff) | |
download | swig-a043b55b69d4587a1bd95b934b85acb683e415e6.tar.gz |
Better clarification about polymorphic wrappers for function objects - std::function
-rw-r--r-- | Doc/Manual/Cpp0x.html | 24 | ||||
-rw-r--r-- | Examples/test-suite/cpp0x_function_objects.i | 29 | ||||
-rw-r--r-- | Examples/test-suite/python/cpp0x_function_objects_runme.py | 8 |
3 files changed, 48 insertions, 13 deletions
diff --git a/Doc/Manual/Cpp0x.html b/Doc/Manual/Cpp0x.html index 0200fdf5c..aa8c41225 100644 --- a/Doc/Manual/Cpp0x.html +++ b/Doc/Manual/Cpp0x.html @@ -735,14 +735,32 @@ int main() { <H3><a name="Cpp0x_Polymorphous_wrappers_for_function_objects"></a>7.3.7 Polymorphous wrappers for function objects</H3> -<p>SWIG fully supports function template wrappers and function objects:</p> +<p> +SWIG supports functor classes in some languages in a very natural way. +However nothing is provided yet for the new <tt>std::function</tt> template. +SWIG will parse usage of the template like any other template. +</p> <div class="code"><pre> -function<int ( int, int )> pF; // function template wrapper +%rename(__call__) Test::operator(); // Default renaming used for Python struct Test { - bool operator()( short x, short y ); // function object + bool operator()(int x, int y); // function object }; + +#include <functional> +std::function<void (int, int)> pF = Test; // function template wrapper + +</pre></div> + +<p> +Example of supported usage of the plain functor from Python is shown below. +It does not involve <tt>std::function</tt>. +</p> + +<div class="targetlang"> +t = Test() +b = t(1,2) # invoke C++ function object </pre></div> <H3><a name="Cpp0x_Type_traits_for_metaprogramming"></a>7.3.8 Type traits for metaprogramming</H3> diff --git a/Examples/test-suite/cpp0x_function_objects.i b/Examples/test-suite/cpp0x_function_objects.i index e864137c7..4b9895ca8 100644 --- a/Examples/test-suite/cpp0x_function_objects.i +++ b/Examples/test-suite/cpp0x_function_objects.i @@ -1,18 +1,35 @@ /* This testcase checks whether SWIG correctly parses function objects and the templates for the functions (signature). - Function objects are objects which overload the operator() function. */ + Function objects are objects which overload the operator() function. + The std::function does not provide any seamless support in the target languages yet. +*/ %module cpp0x_function_objects -%inline %{ -//function<int ( int, int )> pF; // not supported yet by the compiler +%rename(__call__) Test::operator(); +%inline %{ struct Test { int value; - void operator()(short x, short y) { - value=10; + void operator()(int x, int y) { + value=x+y; } - + Test() : value(0) {} } test; + +#include <functional> +std::function<void ( int, int )> pF = test; + +int testit1(Test new_test, int a, int b) { + pF = new_test; + pF(a, b); + return new_test.value; +} + +int testit2(int a, int b) { + test(a, b); + return test.value; +} + %} diff --git a/Examples/test-suite/python/cpp0x_function_objects_runme.py b/Examples/test-suite/python/cpp0x_function_objects_runme.py index edbd88e1c..ed8f888b1 100644 --- a/Examples/test-suite/python/cpp0x_function_objects_runme.py +++ b/Examples/test-suite/python/cpp0x_function_objects_runme.py @@ -3,10 +3,10 @@ import sys t = cpp0x_function_objects.Test() if t.value != 0: - raise RuntimeError,"Runtime cpp0x_function_objects failed. t.value should be 0, but is", t.value + raise RuntimeError("Runtime cpp0x_function_objects failed. t.value should be 0, but is " + str(t.value)) -t(1,2) # sets value +t(1,2) # adds numbers and sets value -if t.value != 10: - raise RuntimeError,"Runtime cpp0x_function_objects failed. t.value not changed - should be 10, but is", t.value +if t.value != 3: + raise RuntimeError("Runtime cpp0x_function_objects failed. t.value not changed - should be 3, but is " + str(t.value)) |