2

文字列をキーとして、メンバー関数へのポインターを値として持つクラスにマップを格納しています。関数ポインターをスローする正しい関数を呼び出すのに問題があります。コードは次のとおりです。

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

using namespace std;


class Preprocessor;

typedef void (Preprocessor::*function)();



class Preprocessor
{

public:
    Preprocessor();
   ~Preprocessor();

   void processing(const string before_processing);

private:

   void   take_new_key();

   map<string, function>   srch_keys;

   string  after_processing;
};


Preprocessor::Preprocessor()
{
   srch_keys.insert(pair<string, function>(string("#define"), &Preprocessor::take_new_key));
}

Preprocessor::~Preprocessor()
{

}


void Preprocessor::processing(const string before_processing)
{
   map<string, function>::iterator result = srch_keys.find("#define");

   if(result != srch_keys.end())
      result->second; 
}


void Preprocessor::take_new_key()
{
   cout << "enters here";
}


int main()
{
   Preprocessor pre;
   pre.processing(string("...word #define other word"));

   return 0;
}

関数Preprocessor::processing内で文字列がマップ内に見つかった場合は、適切な関数を呼び出します。問題は、このコードでPreprocessor::take_new_keyは が呼び出されないことです。

間違いはどこですか?

ありがとう

4

2 に答える 2

7

正しい構文は次のとおりです。

(this->*(result->second))();

それは醜いです。それでは、これを試してみましょう:

auto mem = result->second;  //C++11 only
(this->*mem)();

喜んでいただける方をご利用ください。

于 2013-08-30T15:11:56.290 に答える
3

result->second関数ポインタを呼び出しません。試す((*this).*result->second)();

于 2013-08-30T15:11:04.230 に答える