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
.
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】キャプチャしたラムダを関数ポインタとして渡す
-
[解決済み] C++でstd::functionと関数ポインタのどちらを使うべきですか?