Yanıtlar:
İşaretçiyi tanıtıcıdan kaldırmanız dışında benzer bir sözdizimi vardır:
using FunctionPtr = void (*)();
İşte bir örnek
"Çirkinliği ortadan kaldırmak" istiyorsanız, Xeo'nun önerisini deneyin:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
Ve işte bir başka demo daha .
:(
using FunctionPtr = AddPointer<void()>;
:;)
add_pointer<void()>::type
: Buradaki öneriyi kullanarak: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… yazabilirsiniz pointer<function<void>>
.
Bir işaretçi tanımlamaktan kaçınırsanız, "çirkinlik" de kaldırılabilir:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
daha sonra unutacağım ve kafa karıştırıcı hatalar alacağımdan endişelenebilirim .
Eğer type-id
silmek dışında bir bildirim ile tam olarak aynı olan bir , istiyorum declarator-id
. declarator-id
Genellikle bir tanımlayıcı ve ad equivilant bildiriminde beyan edilmektedir.
Örneğin:
int x
declarator-id
Olduğu x
yani sadece kaldırın:
int
Aynı şekilde:
int x[10]
Şunları çıkarın x
:
int[10]
Örneğiniz için:
void (*FunctionPtr)()
İşte declarator-id
bir FunctionPtr
. bu yüzden almak için kaldırın type-id
:
void (*)()
Bu işe yarar çünkü verilen type-id
her zaman tanımlayıcının bir bildirim oluşturmak için nereye gideceğini benzersiz bir şekilde belirleyebilirsiniz. Standartta 8.1.1'den:
[Type-id] öğesinde, yapı bir [bildirim] olsaydı tanımlayıcının görüneceği yeri benzersiz bir şekilde tanımlamak mümkündür. Adlandırılmış tür daha sonra varsayımsal tanımlayıcının türüyle aynıdır.
Netlik için bu sözdizimine ne dersiniz? (Çift parantez not alın)
void func();
using FunctionPtr = decltype((func));
Başka bir yaklaşım, otomatik dönüş türünü takip eden dönüş türüyle kullanabilir.
using FunctionPtr = auto (*)(int*) -> void;
Bu, takma ad "auto (*)" ile başladığında ve tanımlayıcı adları tarafından gizlenmediğinde, bir şeyin ptr işlevi olduğunu söyleyebilme avantajına sahiptir.
Karşılaştırmak
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
ile
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Feragatname: Bean Deane'nin "Easing into Modern C ++" konuşmasından aldım
using
gerçekten işlev işaretçisi tanımlayıcıları genellikle ortasında ikamet özellikle çünkütypedef
kullanılarak ön tablosu ve hareketusing
. En azından kaybolduğum yer burası.