文字列をインスタンスメンバ関数にマップし、各マッピングをマップに格納したいと考えています。マップ内のメンバ関数へのポインタを格納
このようなことを行うにはどうすればよいですか?
class MyClass
{
//........
virtual double GetX();
virtual double GetSomethingElse();
virtual double GetT();
virtual double GetRR();
//........
};
class Processor
{
private:
typedef double (MyClass::*MemFuncGetter)();
static map<std::string, MemFuncGetter> descrToFuncMap;
public:
static void Initialize();
void Process(Myclass m, string);
};
void Processor::Initialize()
{
descrToFuncMap["X"]=&MyClass::GetX;
descrToFuncMap["SomethingElse"]=&MyClass::GetSomethingElse;
descrToFuncMap["RR"]=&MyClass::GetRR;
descrToFuncMap["T"]=&MyClass::GetT;
};
void Processor::Process(MyClass ms, const std::string& key)
{
map<std::string, Getter>::iterator found=descrToFuncMap.find(key);
if(found!=descrToFuncMap.end())
{
MemFuncGetter memFunc=found->second;
double dResult=(ms).*memFunc();
std::cout<<"Command="<<key<<", and result="<<result<<std::end;
}
}
この方法に問題があるかどうか、それに共通するイディオムは何か教えてください。代わりにfuncをポインタ
の混乱マップのIは、メンバ関数の数が限られていることを考えると声明チェーンは、ところで、私は役に立つの一部を発見したかもしれ
、私は場合のif-else-使用する必要があります情報ここc++-faq-lite
実際には、マップはif-elseチェーンよりも優れていると思います。必要に応じて、他のメタ情報を後で格納するための素晴らしいフックを提供します。関数ポインタから関数ポインタを含む構造体に値の型を加え、必要な情報を追加します。 –
私は同意して、よく見えますが、経験の浅い開発者にとっては理解しにくいです。 –