LINUX.ORG.RU

Необходимо соорудить std::map с указателями на функции...

 , ,


0

2

Причём функции могут иметь различное количество параметров.
Всё что крутится в голове это превратить функции в такое убожество: type function(double var, ...)
Я пока не пробовал делать указатель на функцию с переменным количеством параметров, но даже если это возможно, то мне не нравится идея превращения множества красивых функций в это уродство.
А если уж и превращать, то тогда и вовсе отказаться от std::map и указателей на функции и сделать одну огромную фукцию, принимающую в качестве параметров «название ф-ции», количество параметров ну и это сраное троеточие...
Оба метода некрасивы на мой взгляд. Кто-то сталкивался с чем-то подобным? Как решали вопрос?

★★☆
Ответ на: комментарий от Stahl

Делает. Как минимум для меня.

Это исправимо.
google://variadic template

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

я пишу специфический интерпретатор

Может, тогда есть смысл упороться теорией, и пользовать, нопремер, boost::proto? Благо, создавался он для построения DSL-ей всяких внутри плюсов.

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

Я и так упорот. Тем более, что задача почти выполнена. И сейчас не время и не место всё бросить и начать переписывать заново.

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

делать абстрактный класс с переопределённым оператором (), в std::map хранить указатели на этот базовый класс, вместо функций делать унаследованные объекты с переопределённым оператором (), вызывающим нужную функцию

Я лучше int на ноль поделю — проще и эффективней...

Спасибо, конечно, но что-то твои варианты совсем грустные...
Подожду ещё идей и пойду писать мегафункцию...

Не знаю, чем этот вариант «грустный». Он - лучший из всех предложенных.

Остальные решения либо тянут зависимости в виде boost, либо сводятся к преобразованию указателей в стиле C. А в этом варианте, во-первых, чистый C++ & STL, во-вторых, не нужно реализовывать ручное преобразование типов.

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

Не знаю, чем этот вариант «грустный». Он - лучший из всех предложенных

Просто ты его в код не перевел, тогда будет видно, почему он «грустный».

anonymous
()
Ответ на: комментарий от Stahl

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

- Что мешает сделать массив аргументов и передавать их количество отдельным параметром?

unordered_map <string, function <void(int, double *)> um;
...
double args[3] = {0., 1., 2.};
um["some_func_with_3_params"](3, args);

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

Что мешает сделать массив аргументов и передавать их количество отдельным параметром?

std::vector нынче не в моде?

um["some_func_with_3_params"]( {0., 1., 2.} );

Но, если ТС действительно надо было только это, то это quadro facepalm.

anonymous
()
Ответ на: комментарий от nanoolinux

на цвет не влияет.

На читабельность кода влияет, списки инициализации, range for, один параметр вместо двух, все дела. Ну и на производительность ес-но, но практически невероятно, что именно передача параметров будет узким местом.

anonymous
()

Было, кстати, что-то такое на хабре. При регистрации функции в std::map записывалось имя, вроде, void* на std::function со всеми определёнными типами параметров и возвращаемого значения, и std::type_info на неё. При вызове по имени формировался тип искомой std::function, сравнивался его type_info с сохранённым в map, и если подходило, то выполнялось преобразование из void* и вызов, в противном случае броалось исключение.

O02eg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.