C++: создать список релевантных функторов betwen-startups

Я создаю что-то вроде списка функторов (указателей функций). Затем я записываю их в двоичном виде в файл. Проблема в том, что функтор - это простой указатель на функцию. (поправьте меня, если я ошибаюсь.) Но адрес функции отличается от одного запуска к другому.

Итак, вопрос - есть ли способ создать список функторов, который будет актуален все время?


person Ben Usman    schedule 02.03.2010    source источник
comment
Я не думаю, что функторы и указатели на функции — это одно и то же.   -  person Eric Seppanen    schedule 02.03.2010
comment
Функтор обычно используется для обозначения любого объекта, к которому можно применить синтаксис вызова функции. Сюда входят указатели на функции, а также определяемые пользователем типы, определяющие operator().   -  person Mike Seymour    schedule 02.03.2010


Ответы (3)


Я бы рекомендовал какую-то парную структуру данных с идентификатором с одной стороны и указателем на функцию с другой. Если их достаточно что-то вроде карты:

typedef void (*fptr_t)(); // or whatever your function pointer type is
std::map<std::string, fptr_t> fptr_map;

Ваше приложение должно построить эту карту, когда она впервые понадобится, и кэшировать результат. Затем, когда вы «пишете» указатели функций в файл, вместо этого вы должны писать уникальные ключи std::string. Когда приложение «читает» указатели функций, оно считывает ключи и сопоставляет их с указателями функций для этого вызова программы.

person fbrereto    schedule 02.03.2010
comment
Ну, я на самом деле думал об этом. (В моем случае я просто буду интерпретировать код при каждом запуске демона, а не интерпретировать его самостоятельно). Спасибо за помощь. - person Ben Usman; 02.03.2010

Одно из возможных решений, как упоминает @fbrereto, состоит в том, чтобы пометить разные функторы некоторым уникальным идентификатором (целое число, строка, uuid и т. д.), который не зависит от адресов в каждом конкретном процессе, и сохранить эти ключи в файле. Затем вы можете использовать нечто вроде Factory Design Pattern для создания экземпляров функторов по запросу при чтении файла.

person Nikolai Fetissov    schedule 02.03.2010
comment
В моем случае, я думаю, это не обязательно (у меня все равно есть std::map). - person Ben Usman; 02.03.2010

Да, указатель функции — это просто адрес. Вы не можете полагаться на это. Вместо этого вы можете создать массив функторов и сохранить индексы функторов в файл. или вы можете создавать хеш-таблицы и ссылаться на функторы по имени.

person Andrey    schedule 02.03.2010