1 2 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