
Hello, I've been doing too much Python recently - thanks to boost.python - and my return in the c++ world in quite painful. To help me manage some of my objects lifetime dependencies, I wanted an access to a system similar to the Python WeakKeyDictionary class : Mapping class that references keys weakly. Entries in the dictionary will be
discarded when there is no longer a strong reference to the key. This can be used to associate additional data with an object owned by other parts of an application without adding attributes to those objects.
I drafted a small 'weak_key_map' class based on boost weak_ptr, shared_ptr deleters, and a base class enabling classes to be used as keys in the weak_key_map. A small use case example is shown after, and source of weak_key_map & co are attached. I was wandering if someone had experience to share about a similar system ? For a first draft, it already serves me well - but, I'm not very happy with to "pollute" keys with the base class 'enable_master_ptr'... Any idea to improve all this ? Best regards, Nicolas. int Master_count = 0; class Master : public mgd::enable_master_ptr<Master> { public: Master() { Master_count++; } ~Master() { Master_count--; } }; int Dependent_count = 0; class Dependent : boost::noncopyable { public: Dependent() { Dependent_count++; } ~Dependent() { Dependent_count--; } }; BOOST_AUTO_TEST_CASE( test_weak_key_map_lifeTime ) { typedef boost::shared_ptr<Dependent> value_t; typedef mgd::weak_key_map<Master, value_t> map_t; map_t map; { Master master1; BOOST_CHECK( !map[&master1] ); map[&master1] = value_t( new Dependent ); BOOST_CHECK( map[&master1] ); { Master master2; map[&master2] = value_t( new Dependent ); BOOST_REQUIRE_EQUAL( Master_count, 2 ); BOOST_REQUIRE_EQUAL( Dependent_count, 2 ); } map[&master1] = value_t( new Dependent ); BOOST_REQUIRE_EQUAL( Master_count, 1 ); BOOST_REQUIRE_EQUAL( Dependent_count, 1 ); map.clear(); BOOST_REQUIRE_EQUAL( Master_count, 1 ); BOOST_REQUIRE_EQUAL( Dependent_count, 0 ); } BOOST_REQUIRE_EQUAL( Master_count, 0 ); BOOST_REQUIRE_EQUAL( Dependent_count, 0 ); }