Listing 4
#include <memory> #include <algorithm> #include <map> #include <iomanip> #include <iostream> #include <iterator> #include <ostream> #include <string> using std::tr1::shared_ptr; using std::tr1::weak_ptr; using std::string; using std::map; using std::make_pair; using std::ostream_iterator; using std::copy; using std::basic_ostream; using std::cout; using std::setw; typedef weak_ptr<void> address; typedef map<address, string> name_list; typedef name_list::value_type element; typedef name_list::iterator iter; template <class Ty> void add(name_list& names, shared_ptr<Ty> val, string name) { // add an element to the list of names names.insert(make_pair(address(val), name)); } namespace std { // add to overload set for operator<< template <class Elem, class Traits> basic_ostream<Elem, Traits>& operator<<( basic_ostream<Elem, Traits>& str, const element& elt) { // insert element into stream return str << elt.first.lock() << ", " << elt.second; } } void show_element(string title, iter it, iter last) { // show an element if found cout << setw(6) << title; if (it == last) cout << " not found\n"; else cout << setw(10) << *it << '\n'; } void show_contents(iter first, iter last) { // show elements in half-open range [first, last) cout << " Contents: "; copy(first, last, ostream_iterator<element>(cout, "; ")); cout << '\n'; } int main() { // demonstrate operator< for weak_ptr objects name_list names; shared_ptr<int> sp0(new int(3)); add(names, sp0, "int"); shared_ptr<double> sp1(new double(3.14159)); add(names, sp1, "double"); shared_ptr<long> sp2(new long(-1L)); add(names, sp2, "long"); cout << "After inserting three resources:\n"; show_contents(names.begin(), names.end()); show_element("sp0", names.find(sp0), names.end()); show_element("sp1", names.find(sp1), names.end()); show_element("sp2", names.find(sp2), names.end()); sp1.reset(); cout << "After releasing one resource:\n"; show_contents(names.begin(), names.end()); show_element("sp0", names.find(sp0), names.end()); show_element("sp1", names.find(sp1), names.end()); show_element("sp2", names.find(sp2), names.end()); return 0; }