C / C ++: A (* eval (A (* function) (B), B b)) () {…} возможно ?? (возможно до C ++ 11)

в C / C ++ (возможно, до C ++ 11), это возможно сделать

A (*eval(A (*function)(B), B b))(){
// ... ??
}

то есть функция, принимающая

  1. функция, возвращающая значение A из значения B,
  2. значение 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 не представляется возможным, не так ли?

Еще раз большое спасибо и счастливой Пасхи … 🙂

1

Решение

Я думаю, что вы ищете std::bind, Имя std::bind новый, ранее он был частью Boost.

#include <functional>

std::function<A (void)> curry(A (*fn)(B), B b)
{
return std::bind(fn, b);
}
5

Другие решения

Без 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 если ты можешь.

0

По вопросам рекламы [email protected]