Better clarification about polymorphic wrappers for function objects - std::function
This commit is contained in:
parent
2a90cc6a98
commit
a043b55b69
3 changed files with 48 additions and 13 deletions
|
|
@ -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<int ( int, int )> 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 <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>
|
</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>
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue