В Интернете есть много примеров использования STL для передачи функций или объектов функций в качестве параметров, например, в std::count .
Как мне написать свои собственные функции, которые принимают такие аргументы?
В качестве простого примера скажем, что мой класс:
struct Foo{
int val=0;
int methodinc()const{return val+1};
}
Я хотел бы определить функцию funcall, например:
int funcall (foo arg, function f)
{return f(arg); }
где объявление «функции» — это то, в чем я не уверен, среди прочего. Термин «funcall» пришел из Лиспа, где (funcall f a b c)
просто применяет f
к аргументам a b c.
Тогда что-то вроде этого должно работать:
Foo ff;
funcall(ff,Foo::methodinc); // should return 1
funcall(ff, [](Foo x) {return x.val+1;}) // should return 1
Каковы простые способы сделать это?
Я пишу их как помощники по отладке, «funcall» будет использоваться как часть реализации моих собственных, таких как аналоги моей собственной структуры данных count, remove-if, transform и другие подобные функции STL, которые принимают аргументы функций. Но я не хочу писать сложные шаблонные выражения для определения своего кода.
Первоначальные ответы на этот вопрос предполагают, что вся концепция объявления и использования аргументов функции немного неясна, по крайней мере, для меня. Возможно, прежде чем обратиться к funcall, еще проще было бы просто передать функциональный аргумент другой функции, а не использовать его. Например, в C++ для подсчета вектора v мне нужно написать
std::count(v.begin, v.end(), [](int j){return j>3})
Как можно написать счетчик, который всегда считает весь вектор, чтобы:
mycount(v,[](int j){return j>3})
такой же как выше? И может ли этот «mycount» работать с указателями на функции-члены вместо лямбда-выражений?
Этот вопрос в основном такой же, как вопрос «funcall», но без требования фактического вызова переданного функционального объекта.
funcall(f, a, b, c)
и т. д. - person dyp   schedule 17.05.2014