1つの問題:この変数が明確である場合にのみ、変数のタイプを推測できます。
関数の主な問題は、オーバーロードは、それらの名前だけでは関数を識別するには不十分であることを意味することです。したがって、 indecltype
の過負荷が発生した場合、使用は失敗します。foo
A
struct A {
void foo() const;
void foo(int) const;
};
using PFN_FOO = decltype(A::foo);
source.cpp:6:36: error: decltype cannot resolve address of overloaded function
このように多くを得ることができるかどうかはわかりません...
一方、実際にエイリアスを使用して、エイリアスが正しいことを確認できます。
struct A {
void foo() const;
void foo(int) const;
};
using PFN_FOO = void (A::*)(int) const;
static_assert(std::is_same<PFN_FOO, decltype(static_cast<PFN_FOO>(&A::foo))>::value,
"Ooops, need to update signature of PFN_FOO!");
注:これがテストの最良の方法かどうかはわかりません。基本的に必要なのはstatic_cast
パーツだけです。エラーメッセージを一緒に隠したかっただけです。ただし、より良いメッセージを取得するには、おそらくSFINAEのようなものが必要になります。