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-idsilmek dışında bir bildirim ile tam olarak aynı olan bir , istiyorum declarator-id. declarator-idGenellikle bir tanımlayıcı ve ad equivilant bildiriminde beyan edilmektedir.
Örneğin:
int x
declarator-idOlduğu xyani sadece kaldırın:
int
Aynı şekilde:
int x[10]
Şunları çıkarın x:
int[10]
Örneğiniz için:
void (*FunctionPtr)()
İşte declarator-idbir FunctionPtr. bu yüzden almak için kaldırın type-id:
void (*)()
Bu işe yarar çünkü verilen type-idher 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
usinggerçekten işlev işaretçisi tanımlayıcıları genellikle ortasında ikamet özellikle çünkütypedefkullanılarak ön tablosu ve hareketusing. En azından kaybolduğum yer burası.