LINUX.ORG.RU

Вызов функции из аргумента(C++)

 , ,


0

2

Пишу консольную программу «Органаизер» на С++ и дошел до момента проверки комманд. Пытаюсь сделать это через словарь(map)

map <string, void*> AvailableCommands;

То есть вводится команда, проверяется наличие ключа и после этого мне нужно запустить функцию, которая передаётся в качестве значения словаря. Как это сделать? Можно ли так делать или же лучше это сделать по другому?


Ответ на: комментарий от safocl

абстрактивно он бесплатен

Вовсе нет. По сравнению с указателем на функцию std::function стирает часть информации о типе. Мы используем статически типизированный язык не для того, чтобы применять динамическую типизацию где попало.

annulen ★★★★★
()
Ответ на: комментарий от annulen

std::function стирает часть информации о типе.

где ты такое вычитал в стандарте языка с++? Если это догадка по определенной реализации компилятора — то это лишь определенная реализация. Компилятор может и с указателями на функции делать что угодно тогда уж — многие проверки накладывать...

safocl ★★
()
Ответ на: комментарий от safocl

Мне лень лезть в стандарт, но по-моему это очевидный факт. Если в одну и ту же переменную можно положить 1) указатель на функцию; 2) указатель на метод; 3) произвольный объект-функтор - то часть типовой информации тут безвозвратно потеряна.

annulen ★★★★★
()
Ответ на: комментарий от safocl

std::function стирает часть информации о типе.

где ты такое вычитал в стандарте языка с++?

Не поверите - это его (std::function) единственное предназначение. Мне очень жаль что Вы этого [пока ещё] не поняли.

bugfixer ★★★★★
()
Ответ на: комментарий от untitl3d

«The closure type for a lambda-expression has a public inline function call operator (for a non-generic lambda) or function call operator template (for a generic lambda)» — стандарт говорит, что инлайновый оператор скобок. При этом он может быть как constexpr, так и consteval — «The function call operator or any given operator template specialization is a constexpr function if either the corresponding lambda-expression’s parameter-declaration-clause is followed by constexpr or consteval, or it satisfies the requirements for a constexpr function (9.1.5). It is an immediate function (9.1.5) if the corresponding lambda-expression’s parameter-declaration-clause is followed by consteval.»
Пример с лямбдой на борту — лямбда так же отрабатывает как и обычная функция — и ее «конструирование» сводится к выставлению смещения. — Это без оптимизаций — с ними и это просто выкидывается.

safocl ★★
()
Ответ на: комментарий от annulen

так сама std::function хранит сведения про переданный ей функциональный объект — не важно что это было — а программисту в принципе знать этого не важно почти никогда.

safocl ★★
()
Ответ на: комментарий от Jython

if(AvailableCommands.find(command) != AvailableCommands.end()) { return true; }
return false;

можно заменить на просто

return AvailableCommands.find(command) != AvailableCommands.end()


else if (command == «exit»)

а вот тут у тебя не выполнится никогда — поскольку в предыдущем блоке if будет выполнено.

ну и думаю все же лучше через лямбды сделать то что нужно вместо запихивания указателей на методы.

safocl ★★
()
Ответ на: комментарий от alysnix

commandIsCorrect(const string &com){

тогда уж принимать как он принимает и делать std::move(com) в map.find()...

а то в твоем случае когда будет r-value создастся строка и будет копирование.

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

тогда уж принимать как он принимает и делать std::move(com) в map.find()…

а то в твоем случае когда будет r-value создастся строка и будет копирование.

у него функция просто ищет в map наличие некоей строки. зачем ее куда-то копировать или двигать??? map::find берет агрументом констатную ссылку. зачем для map::find делать еще и move? просто надо передать константную ссылку с самого начала и все.

alysnix ★★★
()
Ответ на: комментарий от alysnix

у него функция просто ищет в map наличие некоей строки. зачем ее куда-то копировать или двигать???

ну когда передастся r-value в функцию — будет лишнее копирование если сделать const& string

ну и да — std::move ничего не делает вообще, кроме как форсит мув-семантику

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

так деды

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

как раз понимают — по данной причине и сделали std::function… (как и многие другие удобства и оптимизации)

Вот никакого отношения к оптимизациям std::function не имеет.

bugfixer ★★★★★
()
Ответ на: комментарий от safocl

передачи интов by const-ref?

а при чем тут енто

Не удержался. При многом. Потому как собираемся пушать 64 бита там где 32-ух должно было хватить. И лишний indirection. Но куда уж дедам-то, они же вообще попИсать вышли…

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

к этой группе людей вы однозначно не относитесь, как бы вам не хотелось.

конечно нет — как и ты...

а по поводу таргетно о с++ — тут вообще все очень строго с принятием новых фич, очень сложная система приобщения чего либо к стандарту — посему прям могу утверждать, что любое нововведение в стандарте с++ это именно необходимые улучшения, без которых были очень сильные неудобства или просадки производительности, а так же баги связанные с безопасностью и подобным.

safocl ★★
()
Ответ на: комментарий от safocl

что с чего вообще такая мысль возникла?

Господин @fsb4000 решил ускорить вызов by function pointer. Там всё интересно конечно… И ему (возможно) до сих пор не очевидно в чём про%^. Не смотря на то что он довольно «крут»…

bugfixer ★★★★★
()
Ответ на: комментарий от hatred

про опору тут я не говорил — просто абстракция с++ не указывает что из себя представляет указатель на функцию, — говорится лишь, что это отдельный тип указателя. По сему нельзя утверждать и обратное, что такой указатель не является void* — мой посыл был про это именно. Как реализовано в отдельно взятом компиляторе — не является чем то значимым.

safocl ★★
()