- functional[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp11[meta cpp]
namespace std {
template <class R, class T>
unspecified mem_fn(R T::* pm); //C++11
template <class R, class T>
unspecified mem_fn(R T::* pm) noexcept; //C++17
template <class R, class T>
constexpr unspecified mem_fn(R T::* pm) noexcept; //C++20
}
- unspecified[italic]
与えられたメンバ関数を呼び出す Callable オブジェクトを生成して返す。
fn(t, a2, ..., aN)
の呼出しが INVOKE
(pm, t, a2, ..., aN)
と等価となる Callable オブジェクト fn
を返す。
fn
の型には、必要に応じて型の別名 argument_type
, first_argument_type
, second_argument_type
, result_type
が定義される。
fn(call_args...)
の呼び出しがinvoke
(pmd, call_args...)
を行うsimple call wrapperオブジェクト fn
を返す。
ここで、pmd
はR T::* pmd(pm)
のように初期化されたfn
が保持するメンバポインタ、call_args...
はpm
の関数呼び出しに必要となる引数リストである。
引数リストcall_args...
は完全転送される。
メンバポインタ呼び出しのためにはcall_args...
の先頭に、T
のオブジェクトもしくはそれを参照する何らかのものが無ければならない(詳細はINVOKE
を参照)。
投げない
#include <functional>
#include <memory>
#include <iostream>
int main() {
auto l = std::make_shared<std::less<int>>();
std::cout << std::boolalpha;
std::cout << (*l)(3, 5) << std::endl;
std::cout << std::mem_fn(&std::less<int>::operator ())(l, 3, 5) << std::endl;
std::cout << std::bind(*l, std::placeholders::_1, 5)(3) << std::endl;
// std::cout << std::bind(l, std::placeholders::_1, 5)(3) << std::endl;
// エラー! std::shared_ptr< std::less<int> > は Callable ではない
// mem_fn() で包むと Callable になる
std::cout <<
std::bind(std::mem_fn(&std::less<int>::operator ()), l, std::placeholders::_1, 5)(3)
<< std::endl;
}
- std::mem_fn[color ff0000]
- std::make_shared[link /reference/memory/make_shared.md]
- std::less[link less.md]
- std::bind[link bind.md]
- std::placeholders::_1[link placeholders.md]
- Callable[link /reference/concepts/Callable.md]
true
true
true
true
- C++11
- Clang: ??
- GCC:
- GCC, C++11 mode: 4.7.0
- ICC: ??
- Visual C++: ??