Как преобразовать указатель на функцию-член в указатель на обычную функцию
Есть класс, внутри которого есть словарь Functions с парами: string : double(*)(double argument) Помимо передачи обычных функций, нужно иметь возможность передавать туда указатель на метод этого же класса. Со вторым пунктом появились проблемы, как известно, нет способа привести указатель на метод к указателю на функцию, поэтому вот как я поступил:
void smp::Oper::addFunction(std::string name, Oper* exp) //
{
ps->Functions[name] = [exp](double argument) { return exp->getResult(argument); };
}
Мне казалось это красивым решением, но MSVS была со мной не согласна. Говорила, что:Ошибка (активно) E0413 не существует подходящей функции преобразования из "lambda []double (double argument)->double" в "smp::Function"
Дело в том, что как только лямбда захватывает из внешнего контекста что-либо, такое преобразование перестаёт работать (дело именно в захвате, это я точно знаю). В данном случае нужно захватить указатель exp, чтобы вызвать у него метод getResult, который и нужно добавить.
Я решил пойти иным путём, а именно вот таким:
template <typename CL>
double closureToFunction(double x) {
CL cl;
return cl(x);
}
void smp::Oper::addFunction(std::string name, Oper* exp)
{
auto lam = [exp](double argument) { return exp->getResult(argument); };
Function func = closureToFunction<decltype(lam)>;
ps->Functions[name] = func;
}
Подумал, может мне получится обойти это всё и сделать сначала лямбду, потом промежуточную функцию с нужной сигнатурой и вот её уже добавить в словарь. Студия перестала меня ругать, это уже радовало. Делаю рантайм и получаю: Ошибка C3497 нельзя сформировать экземпляр лямбда-выражения
Скажите, позволяет ли язык С++ решить мою проблему? Как мне сделать так, чтобы в этот словарь можно было передать и указатель на метод, и на функцию?