C++ 標準ライブラリ<functional>

C++ 標準ライブラリの<functional>ヘッダファイルは、関数オブジェクト(function objects)をパラメータとしてアルゴリズムに渡したり、アルゴリズムの戻り値として使用したりできるようにする一連の関数テンプレートを提供します。関数オブジェクトとは、オーバーロードしたoperator()オブジェクトであり、通常の関数のように呼び出すことができます。

C++ では、関数オブジェクトは特別なクラスであり、それはオーバーロードしていますoperator()オブジェクトが関数のように呼び出されることを可能にします。これにより、動作をオブジェクトとして渡すことができ、コードの柔軟性と再利用性が向上します。

構文

使用するには<functional>ヘッダファイルの機能を使用するには、C++ プログラムにこのヘッダファイルを含める必要があります:

#include <functional>

よく使われる関数オブジェクト

<functional>ヘッダファイルには、一般的に使用される関数オブジェクトが定義されています。以下が含まれます:

  • std::function:汎用のポリモーフィック関数ラッパー。
  • std::bind:関数のパラメータをバインドするために使用されます。
  • std::plus、std::minus、std::multiplies、std::divides、std::modulus:基本的な算術演算。
  • std::equal_to、std::not_equal_to、std::greater、std::less、std::greater_equal、std::less_equal:比較演算。
  • std::unary_negate、std::binary_negate:論理否定演算。
  • std::logical_and、std::logical_or、std::logical_not:論理演算。

例

使用std::function

std::functionはテンプレートクラスであり、関数、ラムダ式、関数オブジェクトなどの呼び出し可能な任意のオブジェクトを格納、呼び出し、コピーできます。

例

#include <iostream>
#include <functional>

void greet() {
    std::cout << "Hello, World!" << std::endl;
}

int main() {
    std::function<void()> f = greet; // 関数を使用
    f(); // 出力: Hello, World!

    std::function<void()> lambda = []() {
        std::cout << "Hello, Lambda!" << std::endl;
    };
    lambda(); // 出力: Hello, Lambda!

    return 0;
}

使用std::bind

std::bindを使用すると、呼び出し時に指定されたパラメータを関数または関数オブジェクトにバインドする呼び出し可能オブジェクトを作成できます。

例

#include <iostream>
#include <functional>

int add(int a, int b) {
    return a + b;
}

int main() {
    auto bound_add = std::bind(add, 5, std::placeholders::_1);
    std::cout << bound_add(10) << std::endl; // 出力: 15

    return 0;
}

この例では、std::placeholders::_1はプレースホルダーであり、呼び出し時にbound_add実際のパラメータに置き換えられます。

比較関数オブジェクトの使用

比較関数オブジェクトはアルゴリズムで使用できます。例えばstd::sort。

例

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

bool compare(int a, int b) {
    return a < b;
}

int main() {
    std::vector<int> v = {5, 3, 9, 1, 4};
    std::sort(v.begin(), v.end(), compare); // カスタム比較関数を使用
    for (int i : v) {
        std::cout << i << " "; // 出力: 1 3 4 5 9
    }

    std::sort(v.begin(), v.end(), std::less<int>()); // 標準ライブラリの比較関数オブジェクトを使用
    for (int i : v) {
        std::cout << i << " "; // 出力: 1 3 4 5 9
    }

    return 0;
}

<functional>ヘッダファイルは C++ 標準ライブラリの中でも非常に強力な部分であり、豊富な関数オブジェクトとツールを提供して、より柔軟で再利用可能なコードを書くことを可能にします。関数オブジェクトを使用することで、動作をパラメータとして渡したり、コンテナに格納したりして、より高度なプログラミング技術を実現できます。

その他の拡張