Better clarification about polymorphic wrappers for function objects - std::function

This commit is contained in:
William S Fulton 2013-02-01 19:17:21 +00:00
commit a043b55b69
3 changed files with 48 additions and 13 deletions

View file

@ -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> <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> <div class="code"><pre>
function&lt;int ( int, int )&gt; pF; // function template wrapper %rename(__call__) Test::operator(); // Default renaming used for Python
struct Test { struct Test {
bool operator()( short x, short y ); // function object bool operator()(int x, int y); // function object
}; };
#include &lt;functional&gt;
std::function&lt;void (int, int)&gt; 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> </pre></div>
<H3><a name="Cpp0x_Type_traits_for_metaprogramming"></a>7.3.8 Type traits for metaprogramming</H3> <H3><a name="Cpp0x_Type_traits_for_metaprogramming"></a>7.3.8 Type traits for metaprogramming</H3>

View file

@ -1,18 +1,35 @@
/* This testcase checks whether SWIG correctly parses function objects /* This testcase checks whether SWIG correctly parses function objects
and the templates for the functions (signature). 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 %module cpp0x_function_objects
%inline %{ %rename(__call__) Test::operator();
//function<int ( int, int )> pF; // not supported yet by the compiler
%inline %{
struct Test { struct Test {
int value; int value;
void operator()(short x, short y) { void operator()(int x, int y) {
value=10; value=x+y;
} }
Test() : value(0) {}
} test; } 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;
}
%} %}

View file

@ -3,10 +3,10 @@ import sys
t = cpp0x_function_objects.Test() t = cpp0x_function_objects.Test()
if t.value != 0: 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: if t.value != 3:
raise RuntimeError,"Runtime cpp0x_function_objects failed. t.value not changed - should be 10, but is", t.value raise RuntimeError("Runtime cpp0x_function_objects failed. t.value not changed - should be 3, but is " + str(t.value))