Как преобразовать указатель на функцию-член в указатель на обычную функцию

Есть класс, внутри которого есть словарь 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 нельзя сформировать экземпляр лямбда-выражения

Скажите, позволяет ли язык С++ решить мою проблему? Как мне сделать так, чтобы в этот словарь можно было передать и указатель на метод, и на функцию?


Ответы (0 шт):