2010-09-22 29 views
6

Czy możliwe jest użycie typu deklarowanej funkcji jako wskaźnika funkcji bez użycia typedef?wskaźnik funkcji bez typedef

deklaracja funkcji:

int myfunc(float); 

użycie deklaracja funkcji przez pewien składni jako wskaźnika funkcji

myfunc* ptrWithSameTypeAsMyFunc = 0; 
+0

Potrzebujesz wskaźnika funkcji, który może wskazywać tylko na twoją własną funkcję? – wheaties

+0

Przysłówek Chcę wskaźnik funkcji do funkcji z tym samym podpisem co myfunc –

+1

Czy wiesz, że można zastosować "typedef" do deklaracji funkcji, aby typedef ich typ? 'typedef int myfunc (float); myfunc * ptrWithSameTypeAsMyFunc = 0; '? Większość ludzi nie jest tego świadoma i uważa, że ​​potrzebuje brzydkiej składni '(* foo)'. –

Odpowiedz

20

Nie jak na normy z 2003 r. Tak, z nadchodzącego standardu C++ 0x i MSVC 2010 oraz g ++ 4.5:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0; 
+0

wygląda ładnie - sprawdzi to ... –

+0

Problem polega na tym, że mój kod nie kompiluje się z włączoną opcją C++ 0x. Więc nie jest to użyteczne rozwiązanie dla mnie: S –

+0

Z g ++ możesz użyć 'typeof (myfunc)' zamiast 'decltype (myfunc)' i działa nawet w trybie innym niż C++ 0x. –

6

Tak, to jest możliwe, aby zadeklarować wskaźnik funkcji bez typedef, ale nie to nie jest możliwe użycie nazwy funkcja do tego.

Typedef jest zwykle używany, ponieważ składnia deklaracji wskaźnika funkcji jest nieco barokowa. Jednak typedef nie jest wymagany. Można napisać:

int (*ptr)(float); 

zadeklarować ptr jako wskaźnik funkcji do funkcji biorąc float i powracający int - typedef nie jest zaangażowany. Ale znowu, nie ma żadnej składni, która pozwoli ci użyć nazwy myfunc, aby to zrobić.

0
int (*ptrWithSameTypeAsMyFunc)(float) = 0; 

Aby uzyskać więcej informacji na temat podstaw, patrz: here.

1

Nie, nie w tej chwili. C++ 0x zmieni znaczenie auto i doda nowe słowo kluczowe decltype, które pozwoli ci na takie rzeczy. Jeśli używasz gcc/g ++, możesz również sprawdzić, używając operatora typeof, który jest dość podobny (ma subtelną różnicę w kontaktach z referencjami).

1

Nie, nie bez C++ 0x decltype:

int myfunc(float) 
{ 
    return 0; 
} 

int main() 
{ 
    decltype (myfunc) * ptr = myfunc; 
} 
1

gcc ma typeof jako rozszerzenie dla C (nie wiem o C++) (http://gcc.gnu.org/onlinedocs/gcc/Typeof.html).

int myfunc(float); 

int main(void) { 
    typeof(myfunc) *ptrWithSameTypeAsMyFunc; 
    ptrWithSameTypeAsMyFunc = NULL; 
    return 0; 
} 
+4

GCC nie potrzebuje rozszerzenia 'typeof' w C++, ponieważ implementuje on (wkrótce będzie standardem)' decltype', który służy w zasadzie temu samemu celowi. – MSalters

3

Czy posible użyć typu o prefiously zadeklarowanej funkcji jako wskaźnik funkcji bez używania typedef?

mam zamiar oszukać nieco

template<typename T> 
void f(T *f) { 
    T* ptrWithSameTypeAsMyFunc = 0; 
} 

f(&myfunc); 

Oczywiście, nie jest to całkowicie bez pułapek: Używa funkcji, więc to musi być zdefiniowane, natomiast takie rzeczy jak decltype Nie używaj funkcja i nie wymagają definiowania funkcji.

Powiązane problemy