ref 関数
引数から reference_wrapper を構築します。
template<class Ty>
reference_wrapper<Ty> ref(Ty& arg);
template<class Ty>
reference_wrapper<Ty> ref(reference_wrapper<Ty>& arg);
戻り値
arg への参照。厳密には、reference_wrapper<Ty>(arg) です。
使用例
次の例では、2 つの関数を定義します。1 つは文字列変数にバインドされます。もう 1 つは、ref の呼び出しによって取得された文字列変数の参照にバインドされます。変数の値が変わったとき、1 つ目の関数では引き続き元の値が使用されますが、2 つ目の関数では新しい値が使用されます。
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>
#include <vector>
using namespace std;
using namespace std;
using namespace std::placeholders;
bool shorter_than(const string& l, const string& r) {
return l.size() < r.size();
}
int main() {
vector<string> v_original;
v_original.push_back("tiger");
v_original.push_back("cat");
v_original.push_back("lion");
v_original.push_back("cougar");
copy(v_original.begin(), v_original.end(), ostream_iterator<string>(cout, " "));
cout << endl;
string s("meow");
function<bool (const string&)> f = bind(shorter_than, _1, s);
function<bool (const string&)> f_ref = bind(shorter_than, _1, ref(s));
vector<string> v;
// Remove elements that are shorter than s ("meow")
v = v_original;
v.erase(remove_if(v.begin(), v.end(), f), v.end());
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
cout << endl;
// Now change the value of s.
// f_ref, which is bound to ref(s), will use the
// new value, while f is still bound to the old value.
s = "kitty";
// Remove elements that are shorter than "meow" (f is bound to old value of s)
v = v_original;
v.erase(remove_if(v.begin(), v.end(), f), v.end());
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
cout << endl;
// Remove elements that are shorter than "kitty" (f_ref is bound to ref(s))
v = v_original;
v.erase(remove_if(v.begin(), v.end(), f_ref), v.end());
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
cout << endl;
}
必要条件
ヘッダー : <functional>
名前空間: std