Вопрос по c++, function-pointers – Карта функций c ++

11

Я сделал карту функций. все эти функции являются недействительными и получают один строковый параметр.

код:

void f1(string params){...}
void f2(string params){...}
void f3(string params){...}

map<string , void*> funcMap;

funcMap["f1"] =(void*)&f1;
funcMap["f2"] =(void*)&f2;
funcMap["f3"] =(void*)&f3;

как я могу вызвать функцию? Я пробовал следующий код, но id не работает:

void (*func)(string) =  &funcMap[commandType];
func(commandParam);

Я получаю это сообщение об ошибке:

Server.cpp:160:46: error: cannot convert ‘void**’ to ‘void (*)(std::string) {aka void (*)(std::basic_string<char>)}’ in initialization

Ваш Ответ

3   ответа
0

&funcMap[commandType]

Просто бросьте&, Ваша ошибка компиляции была полезна здесь. Это былоvoid** справа, потому что вы взялиaddress указателя на функцию. Вам не нужны два уровня косвенности.

пытался. не работал kakush
также звоните с (* f)
16
typedef void (*pfunc)(string);

map<string, pfunc> funcMap; 
funcMap["f1"] = f1; //and so forth

pfunc f = funcMap[commandType];
(*f)(commandParam);   

В общем, зачем выбрасывать безопасность типов? Если это карта указателей на функции, объявите ее как единое целое.

Спасибо! это сработало :) kakush
Я этого не понял. Жара чего именно?
Почему бы не заставить компилятор взять тепло?
Тогда примите ответ :) Вот как мы говорим спасибо здесь, на SO.
& quot; В общем, зачем выбрасывать безопасность типов? & quot; Они не только выбрасывают безопасность типов, но и плохо определены. C и C ++ не определяют, что происходит, когда вы конвертируете между типами указателей на функции и не-типами указателей.
2

Тогда есть методы как виртуальные.

Затем вы можете иметь карту между строкой и базовым классом.

то есть

class Someoperation
{
    virtual void Doit() = 0;
};

map<string, Someopertion> ops;

затем

class MyOp : public Someoperation
{
   void Doit() { /* Some code here */}
};

Просто добавьте объекты

ops["Hello"] = MyOp();

тогда назови это

ops["Hello"].Doit();
Ох, и еще одна вещь. Назначение MyOp для Someoperation (объекты, а не указатели) не перезаписывает указатель таблицы виртуальных функций. Даже если Doit не является абстрактным, будет вызвана реализация базового класса.
Попробуйте скомпилировать. Вы не можете иметь карту абстрактного типа, так как это ошибка при ее создании.
& Quot; ops [& quot; Hello & quot;] = MyOp (); & quot; произойдет ошибка, потому что нет назначения от MyOp для Someoperation. Вам нужна карта указателей Someoperation, чтобы эта техника работала. И это требует динамического размещения и всевозможных проблем времени жизни объекта.
Я попробую это - дать виртуальной машине пинок .....
1. Наследование 2. Не использовать указатели

Похожие вопросы