Передать локальную функцию в качестве параметра глобальной функции

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

template<class integrand>
void integrate(integrand f) {
   ... 
   f();
   ...
}

int main() {
   struct twofer {
       int operator()(int i) const { return 2*i; }
   };

   integrate(twofer());
}

или что-то типа того. Это не удается, потому что я не могу передать локальный объект в шаблон. Я знаю, что новый стандарт позволяет использовать здесь лямбда-функции, но я не могу использовать новый стандарт прямо сейчас. Я действительно хочу, чтобы функция была объявлена ​​локально, потому что я думаю, что это делает вещи читабельными, особенно в реальном коде, для которого это прокси. Я знаю, что мог бы поместить twofer в класс или структуру, полную интегрируемых функций, но опять же я думаю, что это разрушает читабельность. Есть ли альтернативы?


person Fadecomic    schedule 03.02.2012    source источник
comment
Боюсь, вам придется создавать нормальную функцию, потому что анонимные функции поддерживаются только в C++11, en.wikipedia.org/wiki/Anonymous_function#C.2B.2B   -  person Vyktor    schedule 03.02.2012
comment
Использование локальных типов в качестве параметров шаблона также работает в C++11. Для старого стандарта нет реальных обходных путей, за исключением помещения структуры в анонимное пространство имен вне main.   -  person Bo Persson    schedule 03.02.2012


Ответы (2)


Вы можете использовать указатели на функции-члены, но функции должны быть статическими. Это подходит для меня :

#include <iostream>

using namespace std;
typedef int (*Integrand)(int i);

int integrate(Integrand f) {
    return f(2)+f(3)+f(4);
}

int main() {

   struct Twofer {
       static int function(int i){return 2*i;}
    } t;

   cout << integrate (t.function) << "\n";
   return 0;
}
person Tim Kachko    schedule 03.02.2012

Вы путаете классы с объектами. Вы не можете использовать локально объявленный класс для создания экземпляра объекта шаблона.

Я не уверен, что вы подразумеваете под локальной функцией. В C++ нет такой вещи, как локальная функция. Из вашего кода. Ничто не мешает вам вызвать функтор локально определенного объекта локально определенного класса. Но вы не можете создать экземпляр шаблона с ним.

Я не знаю, изменилось ли это с C++11.

person Tom Tanner    schedule 03.02.2012