2011-03-18 2 views
3

일부 기능 프로그래밍을 C++로 가져올 수있는 방법이 있습니까? 일부 LAMBDA 함수 또는 연산자를 다른 함수의 매개 변수로 전달하고자합니다. 모두일부 함수 나 연산자를 매개 변수로 전달하는 방법이 있습니까?

void test2(DWORD foo) 
{ 
    someconnection.Open(); 
    __asm { call foo; } // very weird way, don't think that could work 
    someconnection.Close(); 
} 

및 사용 :

void test(DWORD foo) 
{ 
    try { __asm { call foo; } } // very weird way, don't think that could work 
    catch (...) {() } 
} 

나 : 예를 들어

int main() 
{ 
    ... 
    dosomething(); 
    ... 
    void operator()(int n) // lambda expression, not sure if that correct way creating them 
    { 
    dosomething(); 
    dosomethingelse(); 
    } 
    test (*operator(5)) // here is what I want 
    test2 (*operator(10)) // here is what I want 
    ... 
    dosomethingelse(); 
    ... 
} 

나는 비주얼 스튜디오 2010와 나는 C의 +를 사용할 수 있는지 확실하지를 사용하고 있습니다 거기에 + 0x하지만 내가하고 싶은 일을 할 수 있다면 부스트를 사용할 수 있습니다.

그래서 몇 가지 방법이 있습니까?

+5

Google 함수 포인터 및 부스트 :: 함수 – Patrick

답변

7

매개 변수를 다음과 같이 설정할 수 있습니다. teststd::tr1::function :

void test(std::tr1::function<void(DWORD)> func) { 
    func(0); 
} 

당신은 함수, 멤버 함수 또는 람다와이를 호출 할 수 있습니다 : 함수 객체에

test([](DWORD param) { return; }); 
+0

아아, 마지막 예에서 불일치하는 괄호가 있습니다. –

+0

@ Space_C0wb0y : 그리고 나는 너무 빨리하려고하는'function'의'void' 리턴 타입을 잊어 버렸습니다. 감사. – Jon

+2

참고 :이 태그는 C++ 0x 태그이므로 'tr1' 네임 스페이스가 필요하지 않습니다. –

0

거기에는 stuff in boost 톤이 있습니다.

그러나 일반적으로 너무 깊숙해지기를 권합니다. 문제는 부스트에서 람다와 같은 것들의 implmenetation이 광란하게 복잡해진다는 것이다. 나는 VS와의 컴파일이 하나의 소스 파일에 대해 몇 분이 걸리는 것을 보았고, 당신이 뭔가 잘못하면 ludicrously long unreadable error messages이된다.

글쎄, 실제로 메시지는 모든 부스트 개체의 구현에 매우 익숙한 경우에만 읽을 수 있습니다. IMHO 시설의 고객은 시설을 사용하기 위해 코드화 된 방법에 대한 내부 정보를 많이 알 필요가 없습니다.

관련 문제