| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 
 |  
#include <iostream>
#include <map>
#include <vector>
#include <functional>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>
#include <typeinfo>
#include <boost/assign/list_of.hpp>
 
#define DECLARE_ATTRIBUTES_WITH_ACCESSORS(_TYPE,_NAME)      \
    private:    \
        _TYPE m##_NAME;    \
    public: \
        _TYPE _NAME() { return m##_NAME; } \
        void _NAME( _TYPE const & value ) { m##_NAME = value; } 
 
class User {
    public:
        typedef boost::shared_ptr< User > SharedPtr;
        typedef std::vector< SharedPtr > Vector;
        typedef std::map< std::string, SharedPtr > Map;
 
    public:
        User( std::string const & _login ) { 
            login( _login );
        }
 
        std::ostream & print( std::ostream & oss ) {
            oss << "login: " << login() << std::endl 
            ;
            return oss;
        }
 
    DECLARE_ATTRIBUTES_WITH_ACCESSORS(int, age)
    DECLARE_ATTRIBUTES_WITH_ACCESSORS(std::string, login)
};
 
int main( int argc, char ** argv ) {
    try {
        User::Map users = 
            boost::assign::map_list_of
            ( "user1", new User( "user1" ) )
            ( "user2", new User( "user2" ) )
        ;
 
        /**
         */
        std::for_each( 
            users.begin(), users.end(),
            boost::bind( 
                &User::print, 
                boost::bind( User::Map::value_type::second, _1 ),
                boost::ref( std::cout ) 
            )
        );
 
        /* std::for_each( users.begin(), users.end(), boost::bind( &User::print, _1, boost::ref( std::cout ) ) ); */        
    }
    catch( std::exception const & ex ) {
        std::cerr << "exception: " << ex.what() << std::endl;
    }
    return 0;
} | 
Partager