Difference between revisions of "cpp/utility/functional/mem fn"
(put return type in sub-section) |
m (more serious comment for example 3) |
||
Line 157: | Line 157: | ||
// auto b = std::mem_fn<int& >(&X::get ); // no longer works with new specification | // auto b = std::mem_fn<int& >(&X::get ); // no longer works with new specification | ||
auto c = std::mem_fn<int&()>(&X::get ); // works with both old and new specification | auto c = std::mem_fn<int&()>(&X::get ); // works with both old and new specification | ||
− | auto d = [] (X& x) {return x.get();}; // | + | auto d = [] (X& x) {return x.get();}; // another way to resolve overloaded functions |
return 0; | return 0; |
Revision as of 11:50, 23 August 2012
Template:ddcl list begin <tr class="t-dsc-header">
<td><functional>
<td></td> <td></td> </tr> <tr class="t-dcl ">
<td >/*unspecified*/ mem_fn(R T::* pm);
<td > (1) </td> <td > (since C++11) </td> </tr> <tr class="t-dcl ">
<td >/*unspecified*/ mem_fn(R (T::* pm)(Args...));
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const volatile);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const volatile &);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) &&);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) const &&);
template< class R, class T, class... Args >
/*unspecified*/ mem_fn(R (T::* pm)(Args...) volatile &&);
template< class R, class T, class... Args >
<td > (2) </td> <td > (c++11, but defect) </td> </tr> Template:ddcl list end
Function template std::mem_fn
generates wrapper objects for pointers to member functions, which can store, copy, and invoke a pointer to member function. Both references and pointers (including smart pointers) to an object can be used when invoking a std::mem_fn
.
The overloads (2) are reported as defect. The resolution, which has recently been voted "Tentatively Ready" proposes to remove all the overloads (2). This will break some code, see Example 3.
Contents |
Parameters
pm | - | pointer to member function that will be wrapped |
Return value
std::mem_fn
returns an call wrapper of unspecified type that has the following members:
std::mem_fn Return type
Member types
type | definition |
result_type
|
pm's return Type |
argument_type
|
T* , possibly cv-qualified, if pm takes no arguments
|
first_argument_type
|
T* if pm takes one argument
|
second_argument_type
|
T1 if pm takes one argument of type T1
|
Member function
operator() |
invokes the target member function on a specified object, with optional parameters (public member function) |
Exceptions
None.
Example 1
Use mem_fn
to store and execute a member function:
#include <functional> #include <iostream> struct Foo { void display_greeting() { std::cout << "Hello, world.\n"; } void display_number(int i) { std::cout << "number: " << i << '\n'; } }; int main() { Foo f; auto greet = std::mem_fn(&Foo::display_greeting); greet(f); auto print_num = std::mem_fn(&Foo::display_number); print_num(f, 42); }
Output:
Hello, world. number: 42
Example 2
Pass a member function to std::transform to create a sequence of numbers:
#include <iostream> #include <functional> #include <iterator> #include <memory> #include <string> #include <vector> #include <algorithm> int main() { std::vector<std::string> words = {"This", "is", "a", "test"}; std::vector<std::unique_ptr<std::string>> words2; words2.emplace_back(new std::string("another")); words2.emplace_back(new std::string("test")); std::vector<std::size_t> lengths; std::transform(words.begin(), words.end(), std::back_inserter(lengths), std::mem_fn(&std::string::size)); // uses references to strings std::transform(words2.begin(), words2.end(), std::back_inserter(lengths), std::mem_fn(&std::string::size)); // uses unique_ptr to strings std::cout << "The string lengths are "; for(auto n : lengths) std::cout << n << ' '; std::cout << '\n'; }
Output:
The string lengths are 4 2 1 4 7 4
Example 3
#include <functional> struct X { int x; int& easy() {return x;} int& get() {return x;} const int& get() const {return x;} }; int main(void) { auto a = std::mem_fn (&X::easy); // no problem at all // auto b = std::mem_fn<int& >(&X::get ); // no longer works with new specification auto c = std::mem_fn<int&()>(&X::get ); // works with both old and new specification auto d = [] (X& x) {return x.get();}; // another way to resolve overloaded functions return 0; }
See also
(C++11) |
copyable wrapper of any copy constructible callable object (class template) |
(C++11) |
binds one or more arguments to a function object (function template) |