関数の戻り値の型の場合、2つのパラメーター= decltype(a、b)を持つdecltype

しなければならない

私が会った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]

編集
0

コメントを追加

0

関連記事

分類Dev

decltypeの末尾の戻り値の型を持つ関数テンプレートを特殊化する

分類Dev

パラメータの戻り値の型から関数の戻り値の型を推測する

分類Dev

同じ名前、戻り値の型、異なるパラメーターを持つ2つの関数を宣言できますか

分類Dev

クラスメンバー関数の戻り値の型を持つenable_if

分類Dev

末尾の戻り値の型を持つテンプレートメンバー関数、未使用の場合でもエラーが発生する

分類Dev

複数の引数を持つ `decltype`の意味

分類Dev

2 つの引数を持つ Decltype はタイプを変更します

分類Dev

1つの変数に複数の型(パラメーター/戻り値の型)

分類Dev

decltypeを持つ関数へのポインタのベクトル

分類Dev

パラメータが特定の値の場合の戻り値の型を定義する

分類Dev

void_tとdecltypeを持つ末尾の戻り値の型:それらは完全に交換可能ですか?

分類Dev

Kotlin-関数の戻り値の型を持つ式の場合

分類Dev

たくさんのパラメーターと戻り値を持つ関数のpythonicな方法

分類Dev

2つ以上の戻りパラメーターを持つ関数アノテーション

分類Dev

転送する自動パラメーターを持つC ++ decltype

分類Dev

関数の戻り値の型がvoidの場合、可変個引数パラメーターパック内のすべての関数をどのように呼び出す必要がありますか?

分類Dev

同じ名前とパラメーター、異なる戻り値の型を持つC ++メンバー関数

分類Dev

Qt&C ++:異なる戻り値とパラメーター型を持つ関数ポインターの配列

分類Dev

固有型をパラメーターとして取る関数の戻り値の型が不明確

分類Dev

列挙型パラメーターからTypescript関数の戻り値の型を推測する

分類Dev

パラメータと戻り値の型を持つextends関数の正しい使用法は何ですか

分類Dev

関数パラメーターのdecltype

分類Dev

2つのパラメーターリストを持つ右結合関数

分類Dev

関数からの戻り値を独自のパラメーターの1つに保存します

分類Dev

以前のテンプレートパラメータタイプの自動戻り値の型引数を持つ関数タイプのテンプレートパラメータ

分類Dev

反変型パラメーターを持つ継承された戻り値の型

分類Dev

ライフタイム値を持つRust関数の戻り値の型

分類Dev

ポインタの戻り値の型を持つ関数

分類Dev

2つの括弧と2つのパラメーターを持つJS関数

Related 関連記事

  1. 1

    decltypeの末尾の戻り値の型を持つ関数テンプレートを特殊化する

  2. 2

    パラメータの戻り値の型から関数の戻り値の型を推測する

  3. 3

    同じ名前、戻り値の型、異なるパラメーターを持つ2つの関数を宣言できますか

  4. 4

    クラスメンバー関数の戻り値の型を持つenable_if

  5. 5

    末尾の戻り値の型を持つテンプレートメンバー関数、未使用の場合でもエラーが発生する

  6. 6

    複数の引数を持つ `decltype`の意味

  7. 7

    2 つの引数を持つ Decltype はタイプを変更します

  8. 8

    1つの変数に複数の型(パラメーター/戻り値の型)

  9. 9

    decltypeを持つ関数へのポインタのベクトル

  10. 10

    パラメータが特定の値の場合の戻り値の型を定義する

  11. 11

    void_tとdecltypeを持つ末尾の戻り値の型:それらは完全に交換可能ですか?

  12. 12

    Kotlin-関数の戻り値の型を持つ式の場合

  13. 13

    たくさんのパラメーターと戻り値を持つ関数のpythonicな方法

  14. 14

    2つ以上の戻りパラメーターを持つ関数アノテーション

  15. 15

    転送する自動パラメーターを持つC ++ decltype

  16. 16

    関数の戻り値の型がvoidの場合、可変個引数パラメーターパック内のすべての関数をどのように呼び出す必要がありますか?

  17. 17

    同じ名前とパラメーター、異なる戻り値の型を持つC ++メンバー関数

  18. 18

    Qt&C ++:異なる戻り値とパラメーター型を持つ関数ポインターの配列

  19. 19

    固有型をパラメーターとして取る関数の戻り値の型が不明確

  20. 20

    列挙型パラメーターからTypescript関数の戻り値の型を推測する

  21. 21

    パラメータと戻り値の型を持つextends関数の正しい使用法は何ですか

  22. 22

    関数パラメーターのdecltype

  23. 23

    2つのパラメーターリストを持つ右結合関数

  24. 24

    関数からの戻り値を独自のパラメーターの1つに保存します

  25. 25

    以前のテンプレートパラメータタイプの自動戻り値の型引数を持つ関数タイプのテンプレートパラメータ

  26. 26

    反変型パラメーターを持つ継承された戻り値の型

  27. 27

    ライフタイム値を持つRust関数の戻り値の型

  28. 28

    ポインタの戻り値の型を持つ関数

  29. 29

    2つの括弧と2つのパラメーターを持つJS関数

ホットタグ

アーカイブ