私が会ったdecltype()
テンプレート関数の戻り値の型などの2つのパラメータを持ちます:
template<class C, class F>
auto test(C c, F f) -> decltype((void)(c.*f)(), void()) { }
誰かが2番目のパラメータが何であるか知っていますかvoid()
?どうもありがとうございました。
式で(void)(c.*f)(), void()
:
(void)(c.*f)()
引数なしで呼び出すことができるf
メンバー関数でc
あることを確認するのに役立ちます。とにかく、メンバー関数の戻り値の型が何であるかは問題ではありませんが、名目上はvoid
上記が有効な場合、コンマ演算子はそれを破棄し、2番目の部分を考慮して、全体的な効果がperdecltype(void())
になるようにします。これにより、void
タイプが生成されます。
とにかく, void()
先頭部分がvoid
(Cスタイルのキャスト(void)
)にキャストされるため、末尾が冗長であると以下のプレトリアンのコメント...戻り値の型の-のような条件付き選択を, void()
強調する、ドキュメントとして意図されていると思われますenable_if
、それはスタイルの選択ですそれをさらに短縮するかどうかdecltype((c.*f)(), void())
。
これはSFINAEに使用できますenable_if
が、より自己文書化されます。このコードとmain()
(CTはコンパイル時の略)のコメントを検討してください。
#include <iostream>
template<class C, class F>
auto test(C c, F f) -> decltype((void)(c.*f)(), void())
{ std::cout << "member function\n"; }
template<class C>
void test(C c, int)
{ std::cout << "int\n"; }
struct X {
int f() { return 42; }
double g(int) { return 3.14; }
};
int main()
{
X x;
test(x, &X::f); // ok - outputs "member function\n"
// test(x, &X::g); // CT error - g needs an argument
test(x, 99); // ok - outputs "int\n"
}
出力:
member function
int
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加