1. ホーム
  2. c++

std::function<>と標準関数ポインタの違い?[重複しています]。

2023-10-01 10:19:02

質問

std::function<>と標準的な関数ポインタの違いは何でしょうか?

ということです。

typedef std::function<int(int)> FUNCTION;
typedef int (*fn)(int);

事実上、同じものなのでしょうか?

どのように解決するのですか?

関数ポインタとは、C++で定義された実際の関数のアドレスです。また std::function は、任意のタイプの呼び出し可能なオブジェクト(関数のように使用できるオブジェクト)を保持することができるラッパーです。

struct FooFunctor
{
    void operator()(int i) {
        std::cout << i;
    }
};

// Since `FooFunctor` defines `operator()`, it can be used as a function
FooFunctor func;
std::function<void (int)> f(func);

ここで std::function を使うことで、どのような種類の呼び出し可能なオブジェクトを扱っているのかを正確に抽象化することができます。 FooFunctor であることは分からず、ただそれが void を返し、1つの int パラメータを持ちます。

この抽象化が役に立つ実際の例としては、C++を他のスクリプト言語と一緒に使っている場合があります。C++で定義された関数とスクリプト言語で定義された関数の両方を汎用的に扱えるようなインターフェイスを設計したいと思うかもしれません。

編集する。 バインド

並べて std::function の横には std::bind . この2つは一緒に使うと非常に強力なツールになります。

void func(int a, int b) {
    // Do something important
}

// Consider the case when you want one of the parameters of `func` to be fixed
// You can used `std::bind` to set a fixed value for a parameter; `bind` will
// return a function-like object that you can place inside of `std::function`.

std::function<void (int)> f = std::bind(func, _1, 5); 

この例では、関数オブジェクトは bind は最初のパラメーターを取ります。 _1 を受け取り、それを func として a パラメータとして設定し b を定数 5 .