map.insert ( idPlay, OnPlayItem())
Этот пример возможен только со статическими методами класса. Для нестатических надо делать так: map.insert ( idPlay, &CMedia::OnPlayItem )
class CMedia {
const char * _song_name;
public:
CMedia( const char * song ) : _song_name( song ) {}
void OnEventDefault(void) {std::cout << _song_name << " no method\n"; }
void OnPlayItem(void) { std::cout << _song_name << " play\n" ;}
void OnStopItem(void) { std::cout << _song_name << " stop\n" ;}
};
typedef void (CMedia::*OnEvent)(void);
class CMediaMap {
CMedia & _media;
std::map<int, OnEvent> _map;
public:
CMediaMap( CMedia& media ) : _media( media ) {};
void insert( int eventID, OnEvent handler ) { _map[ eventID ] = handler; }
void operator ()(int eventID) {
OnEvent handler = &CMedia::OnEventDefault;
if ( _map.find( eventID ) != _map.end() ) {
handler = _map[ eventID ];
}
( _media.*(handler) )();
}
};
int main()
{
CMedia song( "Yesterday" );
CMediaMap song_map( song );
song_map.insert( 0, &CMedia::OnPlayItem );
song_map.insert( 1, &CMedia::OnStopItem );
song_map( 0 );
song_map( 1 );
song_map( 2 );
return 0;
}
Результат:
Yesterday play
Yesterday stop
Yesterday no method