回答:
ポインタから識別子を削除することを除いて、構文は似ています。
using FunctionPtr = void (*)();
ここに例があります
「醜さを取り除く」には、Xeoの提案を試してください。
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
そしてここに別のデモがあります。
:(
using FunctionPtr = AddPointer<void()>;
;)
add_pointer<void()>::type
ここの提案を使用してください:groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/…と書くことができますpointer<function<void>>
。
ポインタのtypedefを回避すると、「醜さ」を取り除くこともできます。
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
後で忘れて混乱するエラーが発生するのではないかと心配になるかもしれません。
あなたは欲しいtype-id
、本質的に削除を除いて、宣言とまったく同じです、declarator-id
。declarator-id
通常、これは識別子であり、等価宣言で宣言する名前です。
例えば:
int x
declarator-id
されるx
ので、それを削除します。
int
同様に:
int x[10]
を削除しx
ます:
int[10]
あなたの例のために:
void (*FunctionPtr)()
ここにdeclarator-id
ありFunctionPtr
ます。だからそれを削除してtype-id
ください:
void (*)()
これが機能するのは、与えられたtype-id
識別子が宣言を作成する場所を常に一意に決定できるためです。標準の8.1.1から:
構造が[宣言]である場合に識別子が表示される[type-id]内の場所を一意に識別することができます。名前付きの型は、仮想識別子の型と同じになります。
わかりやすくするためにこの構文はどうですか?(二重括弧に注意)
void func();
using FunctionPtr = decltype((func));
別のアプローチでは、末尾の戻り型と一緒に自動戻り型を使用する場合があります。
using FunctionPtr = auto (*)(int*) -> void;
これには、エイリアスが「auto(*)」で始まり、識別子名によって難読化されていないときに、何かが関数ptrであることを伝えることができるという議論の余地のある利点があります。
比較する
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
と
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
免責事項:私はBean Deaneの「Easing into Modern C ++」の話からこれを取り入れました
using
特に、関数ポインタ識別子は通常、typedef
ステートメントの途中にあり、を使用して前に移動するため、非常に確信がありusing
ます。少なくともそれは私が迷っているところです。