Browse DevX
Sign up for e-mail newsletters from DevX


Solve the Forwarding Problem and Simulate Containers of References-3 : Page 3




Building the Right Environment to Support AI, Machine Learning and Deep Learning

Second Helpings
The helper function ref():

reference_wrapper<T> ref(T& t);

can be used as a short and convenient alternative to typing reference_wrapper<int> (n):

//same as vi.push_back( reference_wrapper<int>(n)); vi.push_back(ref(n));

In places where a reference to a const object is needed, use the helper function cref():

reference_wrapper<const T> cref(const T& t);

cref() takes a reference to a const object and returns a matching reference_wrapper<const T> that provides an implicit conversion to const T&. For example, you can use cref() to create a std::tr1::tuple object that stores references to const:

#include <tuple> #include<utility> using std::tr1::tuple; using std::tr1::make_tuple; A a; const A ca = a; tuple <const A&> cra(cref(ca)); make_tuple(ref(a)); // tuple <A&> tuple <A> t(a);

Author's Note: Technically speaking, const T& is a (non-const) reference to const T, not a const reference to T (C++ doesn't have const references anyway). However, the term "const reference" is used frequently in the C++ literature to denote "reference to const".

Similarly, a reference wrapper can be used with the std::tr1::function facility to create references to function objects and references to const function objects:

class Data { private: vector <pair<int, int> > records; public: bool operator()(int x, int y) { records.push_back(make_pair(x, y)); return x < y; } }; Data rec; function <bool(int, int)> func = ref(rec);

Wrap up
The reference wrapper library is a small, but valuable, enhancement to standard C++. Several other TR1 components, like tuples and std::tr1::function, depend on it. As you have seen, this small library has useful applications in everyday C++ programming as well.

Danny Kalev is a certified system analyst and software engineer specializing in C++. He was a member of the C++ standards committee between 1997 and 2000 and has since been involved informally in the C++0x standardization process. He is the author of "The ANSI/ISO Professional C++ Programmer's Handbook" and "The Informit C++ Reference Guide: Techniques, Insight, and Practical Advice on C++."
Thanks for your registration, follow us on our social networks to keep up-to-date