ホームページ >バックエンド開発 >C++ >C++ 関数ポインターとラムダ式: コールバックの魔法を明らかにする

C++ 関数ポインターとラムダ式: コールバックの魔法を明らかにする

王林
王林オリジナル
2024-04-29 13:42:01380ブラウズ

関数ポインターとラムダ式の両方を使用すると、関数を引数としてコールバック関数に渡すことができます。関数ポインターは関数のアドレスを指す変数を保持しますが、ラムダ式は関数をオンザフライで定義する匿名関数オブジェクトです。実際の例を通じて、関数ポインターとラムダ式を使用して配列要素を合計する方法を示します。これらのテクニックは、柔軟でスケーラブルな C コードを作成するために不可欠です。

C++ 函数指针与 lambda 表达式:揭晓回调魔法

C 関数ポインターとラムダ式: コールバックの魔法を明らかにする

はじめに
関数ポインターとラムダ式は C で重要な役割を果たし、関数をパラメーターとしてコールバック関数に渡すことができます。この記事では、関数ポインターとラムダ式について詳しく説明し、実際の例を通じてその実際の使用法を示します。

関数ポインタ
関数ポインタは、関数のアドレスを保持する変数です。他の変数と同様に、関数を値として渡すことができます。関数ポインターを宣言するには、次の形式に従います。

// 指向具有指定签名的函数的指针
typedef int (*fptr)(int);

ラムダ式
ラムダ式は、関数が存在する場所に関係なくオンザフライで関数を定義できるようにする匿名関数オブジェクトです。必須。構文は次のとおりです。

[capture-list](parameter-list) -> return-type { body };

実用的なケース

次は、関数ポインターとラムダ式を使用して配列内の要素を合計する方法を示す実際的なケースです。 :

コード セグメント 1: 関数ポインターを使用する

#include <iostream>

// 求和函数
int sum(int a, int b) { return a + b; }

// 使用函数指针
using namespace std;

int main() {
  int arr[] = {1, 2, 3, 4, 5};
  int size = sizeof(arr) / sizeof(arr[0]);

  // 指向求和函数的函数指针
  int (*ptr)(int, int) = &sum;

  int total = 0;
  for (int i = 0; i < size; i++) {
    total += ptr(arr[i], arr[i + 1]);
  }

  cout << "Total: " << total << endl;
  return 0;
}

コード セグメント 2: ラムダ式を使用する

#include <iostream>

// 使用 lambda 表达式
using namespace std;

int main() {
  int arr[] = {1, 2, 3, 4, 5};
  int size = sizeof(arr) / sizeof(arr[0]);

  int total = 0;
  for (int i = 0; i < size; i++) {
    total += [](int a, int b) -> int { return a + b; }(arr[i], arr[i + 1]);
  }

  cout << "Total: " << total << endl;
  return 0;
}

コード
コード セグメント 1 では、関数ポインタ ptr を使用して、合計関数 sum を指すアドレスを保持します。配列を反復処理して、各要素とそれに続く要素を ptr に渡します。 sum 関数は、total に加算された 2 つの要素の合計を返します。

コード スニペット 2 では、ラムダ式を使用して匿名の合計関数を定義します。関数ポインターとは異なり、ラムダ式は必要に応じてその場で関数を定義します。スニペット 1 と同じ方法で配列を反復処理し、要素をラムダ式に渡して合計します。

結論
関数ポインターとラムダ式は、関数をコールバック関数に渡すために重要です。関数ポインターは単純な変数を介して関数を渡すメカニズムを提供し、ラムダ式では匿名関数を動的に定義できます。これらのテクニックを理解することで、柔軟でスケーラブルな C コードを作成できます。

以上がC++ 関数ポインターとラムダ式: コールバックの魔法を明らかにするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。