- functional[meta header]
- std[meta namespace]
- reference_wrapper[meta class]
- function template[meta id-type]
- cpp11[meta cpp]
template <class... ArgTypes>
typename result_of<T&(ArgTypes&&...)>::type operator ()(ArgTypes&&... args) const; //C++11
template <class... ArgTypes>
invoke_result_t<T&, ArgTypes...> operator ()(ArgTypes&&... args) const; //C++17
template <class... ArgTypes>
constexpr invoke_result_t<T&, ArgTypes...> operator ()(ArgTypes&&... args) const; //C++20保持している参照に対して関数呼び出しを行う
型Tが関数呼び出し可能な型(Callable)であること。
C++20から、型Tは完全型であること。
INVOKE(get(), std::forward<ArgTypes>(args)...)
operator()はreference_wrapperクラスの直接のメンバ関数とする必要は無い(たとえば、基底クラスからの継承など)。
#include <iostream>
#include <functional>
struct F {
int operator()(int a, int b) const
{
return a + b;
}
};
int main()
{
F f;
// 関数オブジェクトへの参照を保持する
std::reference_wrapper<F> r(f);
// 保持している関数オブジェクトを呼び出す
int result = r(1, 2);
std::cout << result << std::endl;
}- r(1, 2)[color ff0000]
3
- C++11
- Clang: ??
- GCC: 4.7.0 [mark verified]
- ICC: ??
- Visual C++: ??
- P0357R3 reference_wrapper for incomplete types
- テンプレートパラメータ
Tが完全型であるという要件が追加された経緯
- テンプレートパラメータ