2012-02-03 3 views
0

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

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

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

    integrate(twofer()); 
} 

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

+0

Боюсь, вам придется строить «нормальную функцию», поскольку анонимные функции поддерживаются только в C++ 11, http://en.wikipedia.org/wiki/Anonymous_function # C.2B.2B – Vyktor

+1

Использование локальных типов в качестве параметров шаблона * также * работает в C++ 11. Никаких реальных обходных путей для старого стандарта нет, за исключением того, что структура находится в анонимном пространстве имен за пределами основного. –

ответ

1

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

#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; 
} 
0

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

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

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

Смежные вопросы