[解決済み] C++のラムダでキャプチャを関数ポインタとして使用する
2022-10-15 15:36:28
質問
私はC++のラムダとその関数ポインタへの暗黙の変換で遊んでいました。私の最初の例は、ftw関数のコールバックとしてそれらを使用することでした。これは期待どおりに動作します。
#include <ftw.h>
#include <iostream>
using namespace std;
int main()
{
auto callback = [](const char *fpath, const struct stat *sb,
int typeflag) -> int {
cout << fpath << endl;
return 0;
};
int ret = ftw("/etc", callback, 1);
return ret;
}
キャプチャを使用するように修正した後
int main()
{
vector<string> entries;
auto callback = [&](const char *fpath, const struct stat *sb,
int typeflag) -> int {
entries.push_back(fpath);
return 0;
};
int ret = ftw("/etc", callback, 1);
for (auto entry : entries ) {
cout << entry << endl;
}
return ret;
}
コンパイラーエラーが出ました。
error: cannot convert ‘main()::<lambda(const char*, const stat*, int)>’ to ‘__ftw_func_t {aka int (*)(const char*, const stat*, int)}’ for argument ‘2’ to ‘int ftw(const char*, __ftw_func_t, int)’
いくつか読んでみて キャプチャを使ったラムダがあることを知りました。 は暗黙のうちに変換することはできない を関数ポインタに変換することができることを知りました。
これに対する回避策はありますか?暗黙的に変換できないということは、明示的に変換できるということでしょうか?(キャストしてみましたが、うまくいきませんでした)。ラムダを使用して、あるオブジェクトにエントリを追加できるように、作業例を修正するきれいな方法は何でしょうか?
どのように解決するのですか?
キャプチャリングラムダは状態を保持する必要があるため、簡単な回避策はありません。 ではなく ではなく、普通の関数です。関数ポインタのポイントは、単一のグローバルな関数を指していることであり、この情報には状態のための余地がありません。
最も近い回避策(本質的に状態性を破棄する)は、ラムダ/関数からアクセスされるある種のグローバル変数を提供することです。たとえば、伝統的なファンクタオブジェクトを作り、それに静的なメンバ関数を与えて、いくつかのユニークな(グローバル/静的な)インスタンスを参照させることができます。
しかし、それはラムダを捕捉する目的全体を破るようなものです。
関連
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++