「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > `std::function` のテンプレート引数は、オブジェクトの構築中にその型に影響しますか?

`std::function` のテンプレート引数は、オブジェクトの構築中にその型に影響しますか?

2024 年 12 月 13 日に公開
ブラウズ:142

Does the Template Argument of `std::function` Influence its Type During Object Construction?

std::function のテンプレート引数はその型に含まれていますか?

問題の概要

std::function テンプレートを使用する場合、あいまいさ考えられる複数の過負荷が原因で発生する可能性があります。具体的には、次のコード スニペットを検討してください:

#include 

using namespace std;

int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }

int main() {
    a(x); // Call is ambiguous.
    a(y); // Call is ambiguous.
}

このあいまいさは、function と function の両方が汎用関数ポインターから構築できるという事実に起因しています。これにより、関数のオーバーロードに複数の潜在的な一致が発生します。

あいまいさの解決

std::function のテンプレート引数の署名は、宣言および定義中にその型の一部とみなされます。ただし、オブジェクトの構築中はこの限りではありません。

std::function は、C の多くの関数オブジェクトと同様に、型消去と呼ばれる手法を使用します。これにより、呼び出されたときに予期される署名を満たす限り、任意のオブジェクトまたは関数を受け入れることができます。欠点は、署名の不一致に関連するエラーがコンストラクター レベルではなく、実装の奥深くで発生することです。

曖昧さの回避

この曖昧さを回避するには、主に 3 つのオプションがあります:

    ]
  • 明示的な型キャスト: 目的の関数に必要な特定のシグネチャへの関数ポインタを手動でキャストします。 overload.
  • 関数オブジェクトのラッピング: 適切なタイプの関数オブジェクトを作成し、代わりにそれを渡します。
  • テンプレート メタプログラミング (TMP): 使用します。 TMP は、明示的な署名を避け、必要なシグネチャを持つ関数を生成します。 Casts.

結論

std::function のテンプレート引数は、宣言と定義中にその型を決定しますが、オブジェクトの構築では何の役割も果たしません。これにより、コンストラクターが任意の引数を受け入れるときにあいまいさが生じる可能性があります。これを解決するには、プログラマは明示的な型キャスト、関数オブジェクトのラッピング、または TMP.

を使用できます。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3