в C / C ++ (возможно, до C ++ 11), это возможно сделать
A (*eval(A (*function)(B), B b))(){
// ... ??
}
то есть функция, принимающая
который возвращается
— функция, возвращающая A из ()
… ??
Если да, будет ли это
заранее спасибо & ура, Ник
2014-4-20 (1): Спасибо за упоминание ‘evtl.’ (Исправлено) std :: bind. 🙂
Итак, чтобы понять — (в C / pre C ++ 11 без Boost) указатели на функции являются исключительными в том смысле, что внутри функции, это только возможно объявлять их, но есть ни за что в создать или изменить экземпляр — поскольку определения функции / метода являются только возможные источники для экземпляров указателей на функции, откуда они могут быть переданы либо явно, либо аргументами функции / метода ??
Просто спрашиваю, так как мне не ясно о возможном внутреннем представлении указателей на функции …
2014-4-20 (2): При содействии Danvil пришло время раскрыть, здесь то же самое с шаблонами:
template<typename T,typename A>
struct Evaluator {
T(*f)(A);
A a;
T operator()() const { return f(a); }
};
template<typename T,typename A>
Evaluator<T,A> eval(T(*f)(A), A a) {
Evaluator<T,A> w;
w.f= f; w.a= a;
return w;
}
Это работает, в то время как, как некоторые уже могли догадаться, целое из произвольных совпадающих наборов функций / аргументов предназначено для отправки в качестве процедуры с нулевым параметром в одну функцию / метод, выполняющий выполнение, аналогичное операции try / catch.
Чтобы не приходилось использовать в основном идентичный код для каждого различного количества параметров, реальная идея заключалась в том, чтобы сгенерировать все еще не выполненное задание в качестве такой процедуры с нулевым параметром одного типа для всех случаев.
Тем не менее, я не могу найти способ, как создать или изменить указатель на функцию внутри функции; «Typecasting» в некотором роде для Evaluator не представляется возможным, не так ли?
Еще раз большое спасибо и счастливой Пасхи … 🙂
Я думаю, что вы ищете std::bind
, Имя std::bind
новый, ранее он был частью Boost.
#include <functional>
std::function<A (void)> curry(A (*fn)(B), B b)
{
return std::bind(fn, b);
}
Без C ++ 11 это могло бы работать так:
typedef A(*Func)(B);
struct Evaluator {
Func f;
B b;
A operator()() const
{ return f(b); }
};
Evaluator eval(Func f, B b) {
Evaluator w;
w.f = f;
w.b = b;
return w;
}
Это по сути то, что std::bind
делает, так что используйте std::bind
если ты можешь.