2013-05-11 13 views

Odpowiedz

127

Ma podobną składnię, z wyjątkiem usunąć identyfikator ze wskaźnikiem:

using FunctionPtr = void (*)(); 

Oto Example

Jeśli chcesz „zabrać uglyness”, spróbować co sugeruje Xeo:

#include <type_traits> 

using FunctionPtr = std::add_pointer<void()>::type; 

A tutaj kolejny demo.

+15

Dang, miałem nadzieję, że to odbierze brzydotę ': (' – rubenvb

+9

@rubenvb: 'using FunctionPtr = AddPointer ;';) – Xeo

+18

@Xeo Nie jestem całkowicie przekonany, że jest bardziej czytelny. – Cubic

9

Chcesz type-id, który jest w zasadzie dokładnie taki sam jak deklaracja, z wyjątkiem usunięcia declarator-id. declarator-id jest zwykle identyfikatorem i nazwą, którą deklarujesz w deklaracji równoważnej.

Na przykład:

int x 

declarator-id jest x tak po prostu usunąć go:

int 

Podobnie:

int x[10] 

Zdjąć x:

int[10] 

Dla przykładu:

void (*FunctionPtr)() 

Tutaj declarator-id jest FunctionPtr. tak po prostu usunąć go, aby uzyskać type-id:

void (*)() 

To działa, ponieważ dali type-id zawsze można jednoznacznie określić, gdzie identyfikator pójdzie do tworzenia deklaracji. Z 8.1.1 w normie:

Możliwe jest jednoznaczną identyfikację położenia w [typu id] Gdy identyfikatorem wydaje jeśli konstrukcja była [zgłoszenia]. Nazwany typ jest wtedy taki sam jak typ hipotetycznego identyfikatora .

7

A co z tą składnią w celu uzyskania większej przejrzystości?(Uwaga podwójny nawias)

void func(); 
using FunctionPtr = decltype((func)); 
+1

Co oznacza podwójne nawiasy w tym kontekst? A * odwołanie * do wskaźnika funkcji? – 0x499602D2

+5

Twój 'FunctionPtr' nie jest wskaźnikiem funkcji, ale' decltype (& f) 'jest, patrz [tutaj] (http://coliru.stacked-crooked.com/view?id=77def487d5ed99885c0523d48c2ae7a1-50d9cfc8a1d350e7409e81e87c2653ba). – rubenvb

+0

@ 1234597890 FunctionPtr jest niestanowiącą wartości stałej lwartość typu 'void()' –

27

W "brzydota" może być również zabrane jeśli uniknąć typedef-ing wskaźnik:

void f() {} 
using Function_t = void();  
Function_t* ptr = f; 
ptr(); 

http://ideone.com/e1XuYc

Powiązane problemy