2012-02-18 9 views
1

私はC++でコマンドプロンプトを作成しています。私は、ユーザーが「何か」などの行を入力したいと思います。これは分割され、 "say"はコマンド名になり、 "something"はパラメータになります。これまでのところ、とても良い - これは既に働いています。特定のコマンドに適切なメソッドを呼び出す

私は、適切なメソッドを呼び出すコマンドの名前を使用したいと思います。私はルックアップテーブルのいくつかの種類を使用することができますが、より良い方法はありますか?私は「最善のアプローチをオブジェクトをされて機能するようにテーブルマッピング名のいくつかの並べ替え:

答えて

2

は、おそらくあなたは反射のいずれかの種類をサポートしていません

#include <string> 
#include <map> 

class CmdHandler // our handler class 
{ 
public: 
    void Handler(const std::string &arg){}//our handler method 
}; 


typedef void (CmdHandler::*MethodPtr)(const std::string &); // make typedef to easily deal with the type of the member-function pointer 

std::map<std::string, MethodPtr> my_handlers; // make our method lookup table 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CmdHandler handler; 
    //add a real member-function pointer for the "say" command 
    my_handlers.insert(std::make_pair("say", &CmdHandler::Handler)); 

    //look for the handler of command "say" and call it instantly 
    (handler.*my_handlers["say"])("something"); 
    return 0; 
} 
+0

感謝。あなたのコードで何が起こっているのかを説明できますか? –

+0

コードにコメントします。ちょっと待って... – Jurlie

+0

はこれで今はっきりしていますか? – Jurlie

2

C++コマンドのキーワードと関数やメソッドポインタのマップのようなものを必要とします私は意識している。

1

ルックアップテーブルが通常の方法です。通常、std::map ...ブーストを使用している場合は、boost::functionboost::bindを参照してください。

コンパイルマクロ__FUNCTION__(コンパイル時に現在の関数のデコレートされていない名前に展開され、エラーメッセージで頻繁に使用されるため、メンバ関数名からクラス名を削除する必要があります)コマンド機能では、スペルミスや余分なタイピングを避けるため、マップ内の関数を登録する必要があります。

BOOST_CURRENT_FUNCTIONの移植マクロであるかもしれないことに注意してください。)

関連する問題