Как мне создать C ++ карту указателей на объектные функции? - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь создать карту строк для функций.Когда это простая функция, я видел, как это сделать так:

typedef int (*GetIntFunction)(void);

int get_temp()
{
  return 42;
}

map<string, GetIntFunction> get_integer_map { { "temp", &get_temp } };

auto iter = get_integer_map.find("temp");
int val = (*iter->second()();

Однако я бы хотел, чтобы мой указатель на функцию был функцией определенного объекта.И я знаю, какой объект мне нужен при создании карты.Примерно так:

class TemperatureModel
{
public:
  int GetTemp();
}

TemperatureModel *tempModel = new TemperatureModel();

map<string, GetIntFunction> get_integer_map { { "temp", &(tempModel->GetTemp} };

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

1 Ответ

0 голосов
/ 25 октября 2018

Самый простой подход к нам, старомодным типам, - написать функцию:

int call_it() {
    return tempModel->GetTemp();
}

и сохранить эту функцию на карте в вопросе:

map<string, GetIntFunction> get_integer_map {
    { "temp", call_it }
};

Более новый подходиспользовать лямбду:

map<string, GetIntFunction> get_integer_map {
    { "temp", [=]() { return tempModel->GetTemp(); }
};

Другой подход (как это было предложено в комментарии Камиля Цука) - использовать std::function для привязки объекта и функции:

map<string, std::function<int()>> get_integer_map {
    { "temp", std::function<int()>(&TemperatureModel::GetTemp, tempModel) }
};

Внимание: код написан, но не скомпилирован;могут быть ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...