関数をmapに

昔ハンドラを書くときに、URIと呼び出したいファンクションと幾つかのフラグを構造体に入れて、リクエストのたびにforでまわしてURIが定義されていれば、、、なんてコードを書いていた時代を思い出した。

32 名前: デフォルトの名無しさん [sage] 投稿日: 2007/09/28(金) 14:34:34

std::string str 

switch( str ) 
{ 
  case "あいうえお" 
    funcA(); 
    break; 

  case "かきこくけこ" 
    funcB(); 
    break; 

  (同様に続く・・・) 
} 

のように処理させたいけど文字列な為に出来ません
この様な場合どういうやり方が一般的ですか?

if文でゴリゴリ書くしかない?
33 名前: デフォルトの名無しさん [sage] 投稿日: 2007/09/28(金) 15:12:10
一般的じゃないかもしれないけどこういう手が楽っぽい

#include <map> 
#include <string> 
#include <iostream> 

void funcA() { std::cout << "invoke func A\n" ; } 
void funcB() { std::cout << "invoke func B\n" ; } 

int main(void) { 
 std::map< std::string, void(*)(void) > funcs ; 
 funcs[ "あいうえお" ] = funcA ; 
 funcs[ "かきこくけこ" ] = funcB ; 

 std::string str = "あいうえお" ; 
 void(*f)(void) = 0; 
 f = funcs[str]; 
 if ( !f ) 
  // default: の処理 
 else 
  f(); 

 return 0; 
} 

要は条件をキー、呼び出す関数を値にするmapだな
値をboost::functionへの参照とかにしてやれば、動的なオブジェクトのメソッドを呼び出すことも可能