2012-02-03 4 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()); 
} 

또는 무언가 : 그것은 통합과 같은 간단한 수학 기능 구현을 해결하는 가장 간단한 방법처럼 보인다. 템플릿에 로컬 객체를 전달할 수 없기 때문에이 작업은 실패합니다. 나는 새로운 표준이 람다 함수가 여기에서 사용되도록 허용한다는 것을 알고 있지만, 나는 지금 새로운 표준을 사용할 수 없다. 나는이 함수가 지역 코드로 선언되기를 바란다. 왜냐하면 이것은 물건을 읽을 수있게 만든다고 생각하기 때문이다. 나는 클래스 나 구조체에 integerble 함수로 가득 찬 두 개를 넣을 수는 있지만, 가독성을 파괴한다고 생각합니다. 대안이 있습니까?

+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에서 변경되었는지는 확실하지 않습니다.

관련 문제