получить имя вызванной функции - PullRequest
3 голосов
/ 01 августа 2010

при использовании операторов «.», «->» или «-> *» есть ли способ получить имя вызываемой функции (или имя переменной в случае «-> *»и все идет.

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, я не говорю об отражении, но больше что-то в строке ' function ' в основном я хочу создатьперегрузка оператора (предпочтительно одного из трех упомянутых), который осведомлен о правой стороне оператора

То, что я пытаюсь сделать, это в основном преобразование времени компиляции

obj->Function(a,b);

до

obj->Map("Function")(a,b); //Where Map(string) returns a function pointer

РЕДАКТИРОВАТЬ: Просто для дальнейшего уточнения, Требование состоит в том, что код должен выглядеть как один из этих трех

obj.SomeMethod(args);
obj->SomeMethod(args);
obj->*SomeMethod(args);

любое решение, которое подходит, является приемлемым, если SomeMethod может быть любым допустимым идентификатором (т. Е. Любой вещью, которая может использоваться в качестве имени функции), и решение должно будет использовать SomeMethod в качестве поиска на карте.часть уже реализована, это натолько переосмысление того, что похоже на вызов метода, для которого я ищу решение.

, если это (как я боюсь) не может быть сделано, тогда будет принято любое решение с новым синтаксисом "оператора".Например, obj __ SomeMethod (args);до тех пор, пока поиск основан на RHS «оператора»

Ответы [ 5 ]

1 голос
/ 02 августа 2010

Я решил проблему, с которой вы столкнулись совсем недавно.Я делал привязки Javascript к C ++ и мне нужно было иметь карту функций с именем -> функция.Я вызываю такие функции:

vector<WebValue> params;  // Parameters for the function, I get these from the JS engine usually
params.push_back(asValue("Some string"));
params.push_back(asValue(123456));
params.push_back(asValue(1.0f));
functionMap["SomeFunction"]->call(params);  // SomeFunction must accept char*, int and float compatible parameters

и регистрирую их так:

functionMap["SomeFunction"] = jsExport(this, &MyClass::SomeFunction);

или так, если это функция-член и "this" доступно в текущей области:

regMember(SomeFunction);

Я использовал Boost Fusion и Boost Function Type, чтобы сделать грязную работу за меня.Он доступен из исходников проекта OpenLieroX:http://bit.ly/dd70G6

Использование его:http://bit.ly/9Sa84q - содержит методы регистрации функций на картеhttp://bit.ly/b7oWNo - содержит удобный макрос regMember для регистрации функций-членов

Вы также можете посмотреть другие файлы в каталоге для лучшего понимания:http://bit.ly/b7oWNo

Это не совсем то, что вы описали в своем вопросе, но, надеюсь, это поможет вам.

1 голос
/ 01 августа 2010

при использовании операторов '.', '->' или '-> ' есть ли способ получить имя вызываемой функции (или имя переменной в случае'-> ' и все идет.

Нет встроенного механизма (я знаю о), который бы позволял это.

Вы можете получить имя current функция во время компиляции с использованием макроса __FUNCTION__. Это не стандартно, но поддерживается в MSVC и может поддерживаться в g ++ (не уверен).

Если вы хотите знать,имя функции во время выполнения, тогда вам нужно будет реализовать какой-то специальный механизм для этого - создать таблицу имен и адресов функций (которая будет инициализирована при запуске) и искать ее по имени функции каждый раз, когда вам нужно имя функции изЕсли компилятор поддерживает макросы __FUNCTION__ или имеет какие-либо другие способы получения имени для текущей функции, вы можете упростить это с помощью макросов (вы можете заключить всю процедуру «регистрации» в один вызов макроса, который будетнаходиться внутри функции, которую вы хотите зарегистрировать).Это, вероятно, будет непереносимым.

Отладочная информация программы также может содержать информацию, которую вы ищете, но это даже хуже, чем полагаться на макрос __FUNCTION__.

1 голос
/ 01 августа 2010

Насколько я знаю, нет. C ++ не поддерживает какую-либо форму отражения, поэтому для получения такой информации вам необходимо разработать собственные инструменты и приемы.

1 голос
/ 01 августа 2010

C ++ не имеет никакого отражения. Имена функций исчезли к тому времени, когда исполняется ваш исполняемый файл. Единственный способ сделать это - передать их.

Если вы планировали что-то сделать на основе имени метода, возможно, вам просто нужны виртуальные методы или перегрузка, чтобы вызывался правильный код.

0 голосов
/ 01 августа 2010

Нет.С ++ почти не имеет отражения.Если вы не хотите этого для целей отладки, вам это не нужно.И отладка может быть выполнена даже без нее.

Ответ на EDIT : Либо вы используете какой-то функтор с несколькими перегруженными operator() функциями, либо ваша карта должна будет содержать только функциитого же типа или, по крайней мере, из тех же параметров и возвращаемого значения (если вы хотите использовать что-то вроде boost::function<>).Если вы используете функтор с перегруженным оператором (), то вы отказываетесь от безопасности типа времени компиляции и будете ограничены некоторыми параметрами N.

То, что вы решили сделать, сродни boost::bind / boost::function,Посмотрите на их заголовки.Если вы не хотите ограничить свою реализацию по отдельности, вряд ли у вас получится что-нибудь попроще, чем они используют.

...