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

Kendi parametrelerinde kendini kabul eden bir işlev işaretçisini nasıl bildiriyorsunuz? Dolaylı olarakKendisine başvuran bir yazım hatası

+1

o hiç bitmeyen özyinelemeli tanımı çünkü:

Ne yapabilirsiniz bir boşluk işaretçisi geçmek ve türüne döküm olduğunu. –

+3

@SethCarnegie: argümanınız geçersiz. yapı X {X * a; }; 'kavramsal olarak aynıdır, fakat * izin verilir *. – ybungalobill

+1

@ybungalobill: Hayır, bir işlev türü parametrelerini içerir, sınıf türü üyelerini içermez. – Xeo

cevap

8

: Benim örnek gördüğünüz gibi

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)); 
} 

Ben asla o herhangi kullanımını görebiliyordu değil.

+1

Tam olarak sorulan bu değildi, ama muhtemelen gidebildiğin kadar uzak. –

+0

Bunu kullanabilirim, teşekkürler Xeo. – Tergiver

2

Bunu tür sistemde ifade edemezsiniz. Bu konuda temel olarak yanlış bir şey olmamasına rağmen, tip sistemi içindeki döngüleri ortadan kaldırarak işleri kolaylaştırır. Bu bana Axiom of Foundation'u hatırlatıyor. Yapamazsınız

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

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

'void *' işaretçisini, bu gibi işlev işaretçilerine alamazsınız. POSIX, void * ptr; FunctionPtrType fptr; * (void **) (& fptr) = ptr; ', tanımlanmamış davranışlardan kaçınmak için. –

+0

@ R.MartinhoFernandes: Uygulamanızın tanımlanmış olduğu doğru. Ama bunu, herhangi bir “von von Neumann” mimarisinde “void *” ve aynı boyuttaki fonksiyon göstergelerini kullanarak yapabilirsiniz. – ybungalobill

+2

Eklemelerin ne kadar fazla eklenme düzeyine sahip olursanız olun, void * 've işlev işaretçileri arasında kolayca yüklenemezsiniz. Bunun yerine başka bir işlev işaretçisi türü kullanın. –

İlgili konular