2011-12-21 3 views
13
typedef bool (*Foo)(Foo a, Foo b); 

매개 변수에서 자체를 허용하는 함수 포인터를 어떻게 선언합니까? 간접적으로자체를 참조하는 typedef

+1

을가 끝없는 재귀 정의이기 때문에 :

은 무엇 당신이 할 수있는 것은 무효 포인터를 전달하고 유형으로 캐스팅이다. –

+3

@SethCarnegie : 귀하의 주장은 유효하지 않습니다. 'struct X {X * a; }; 개념적으로 동일하지만 * 허용됩니다. – ybungalobill

+1

@ybungalobill : 아니요, 함수 유형에 매개 변수가 들어 있습니다. 클래스 유형에는 구성원이 들어 있지 않습니다. – Xeo

답변

8

: 내 예에서 볼 수 있듯이

struct Foo{ 
    typedef bool (*FooPtr)(Foo a, Foo b); 
    Foo(FooPtr p) 
     : p(p) 
    {} 

    bool operator()(Foo a, Foo b) const{ 
    return p(a,b); 
    } 

    FooPtr p; 
}; 

struct Bar{ 
    Bar(Foo f) 
     : some_callback(f) 
    {} 

    Foo some_callback; 
}; 

bool a_callback(Foo a, Foo b){ 
    return false; 
} 

int main() { 
    Bar b(a_callback); 
    b.some_callback(Foo(a_callback), Foo(a_callback)); 
} 

나는 지금까지 그 어떤 사용을 볼 수 있었다하지 않는 것이.

+1

정확히 무엇이 요구되었는지는 모르겠지만 가능한 한 멀리 갈 수 있습니다. –

+0

나는 이것을 사용할 수있다, 고맙습니다. 제오. – Tergiver

2

유형 시스템에서는이를 표현할 수 없습니다. 근본적으로 잘못된 것은 없지만 형식 시스템 내에서 사이클을 제거하여 단순화합니다. 나는 강력하게 Axiom of Foundation을 생각 나게합니다. 당신은 할 수 없습니다

typedef bool (*Foo)(void* a, void* b); 

bool f(void* a, void* b) 
{ 
    return ((Foo)a)(a,b); 
} 
+1

'void *'포인터를 그처럼 함수 포인터에 캐스트 할 수 없습니다. POSIX는'void * ptr; FunctionPtrType fptr; * (void **) (& fptr) = ptr;', 정의되지 않은 동작을 방지합니다. –

+0

@ R.MartinhoFernandes : 당신은 그것이 구현 정의 된 것입니다. 그러나'void *'와 같은 크기의 함수 포인터가있는 정교한 폰 노이만 아키텍처에서이 작업을 수행 할 수 있습니다. – ybungalobill

+2

얼마나 많은 여분의 간접 참조를 추가하든 관계없이,'void *'와 함수 포인터 사이에 이식 가능하게 캐스트 할 수 없습니다. 대신 다른 함수 포인터 유형을 사용하십시오. –