Respostas:
Tem uma sintaxe semelhante, exceto que você remove o identificador do ponteiro:
using FunctionPtr = void (*)();
Aqui está um exemplo
Se você quiser "tirar a feiura", tente o que Xeo sugeriu:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
E aqui está outra demonstração .
:(
using FunctionPtr = AddPointer<void()>;
)
add_pointer<void()>::type
: Usando a sugestão aqui: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/…, você pode escrever pointer<function<void>>
.
A "feiúra" também pode ser removida se você evitar digitar um ponteiro:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
mais tarde e obter erros confusos.
Você deseja um type-id
, que é essencialmente exatamente o mesmo que uma declaração, exceto que você exclui o declarator-id
. O declarator-id
geralmente é um identificador e o nome que você está declarando na declaração equivilant.
Por exemplo:
int x
O declarator-id
é x
apenas removê-lo:
int
Da mesma forma:
int x[10]
Remova o x
:
int[10]
Para o seu exemplo:
void (*FunctionPtr)()
Aqui declarator-id
está o FunctionPtr
. então remova-o para obter o type-id
:
void (*)()
Isso funciona porque, dado a, type-id
você sempre pode determinar exclusivamente para onde o identificador iria para criar uma declaração. De 8.1.1 no padrão:
É possível identificar exclusivamente a localização no [ID do tipo] onde o identificador apareceria se a construção fosse uma [declaração]. O tipo nomeado é então o mesmo que o tipo do identificador hipotético.
Que tal esta sintaxe para maior clareza? (Observe parênteses duplos)
void func();
using FunctionPtr = decltype((func));
Outra abordagem pode usar o tipo de retorno automático com o tipo de retorno à direita.
using FunctionPtr = auto (*)(int*) -> void;
Isso tem a vantagem discutível de poder dizer que algo é uma função ptr quando o alias começa com "auto (*)" e não é ofuscado pelos nomes dos identificadores.
Comparar
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
com
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Disclaimer: Eu peguei isso da palestra "Easing into Modern C ++" de Bean Deane
using
, principalmente porque os identificadores de ponteiros de função geralmente residem no meio de umatypedef
instrução e movem-se para a frente usandousing
. Pelo menos é onde estou perdido.