2017-05-10 14 views
0

C++を使った経験はあまりなく、問題に苦しんでいます。以下のコードはスニペットから一種のものです。私はクラスを書いていますし、私はそれが文字列キーと関数値の属性マップを持つようにしたい:ブール関数と単一引数のマップ

std::map< std::string, std::function<bool(std::string)> > selection_filters;

私は、次のようにペアを追加したい:

auto some_func = [] (std::string value) { return value == "some_val"; }; 

selection_filters["some_key"] = some_func; 
//or 
selection_filters.insert(std::make_pair("some_key", some_func)); 

は、このような私ができること:

if (selection_filters["some_key"]("function param") == true) { 

//etc.. 

} 

これはコンパイルが、実行時にエラーがスローされます:

terminating with uncaught exception of type std::__1::bad_function_call: std::exception

は、私はそれがマップ定義でstd::function<bool(std::string)>間の不一致とは何かを持っていることが疑われる、とラムダ関数の使用は[] (std::string value) { ... };

は、私は非常にラムダ関数の使用を維持したいと思いますし、マップ上の添字演算子(map['some_key'](..))を介して関数にアクセスする可能性がありますが、C++についての私の知識は解を得るには十分ではありません。 と改善ための提案を提供し、

は、誰かしてくださいポイントタイムアウトエラー私が作ってるんだ(私が勉強したいし、それがスローされる理由)できますか?

+1

地図のアクセスに誤字があるかもしれません。 '[]'を使って関数を検索し、それがマップにない場合は、検索したキーとファンクションの仮引数(nullポインタ?これを試しませんでした)を使って新しいエントリを作成します。ダミー関数を呼び出すと、例外がスローされます。 'map.find()'を使用して、返されたイテレータ '!= map.end()'をチェックして、キーrealyがマップにあるかどうかを確認してください。 – AlexanderS

+0

ありがとう!私はまだ設定されていないキーにアクセスしようとしていました。とてもばか。これで解決しました。 – TBZ92

答えて

3

What causes std::bad_function_call?

欠落や空の関数を参照してください。

if(selection_filters["some_key"]) 

あなたが[]演算子を使用する場合:

if(selection_filters.find("some_key") != selection_filters.end()) 

または少なくとも機能が有効なターゲットを持っていることを確認し、関数を呼び出す前に、「some_key」はマップに存在することを確認してくださいstd::mapには、デフォルトの構築済みオブジェクト(またはゼロ)がまだマップにない場合は挿入されます。これにより、明示的に設定していないキーに対して無効なエントリが多数発生する可能性があります。

+0

これは上記の@AlexanderSの回答と一致します。それは問題を解決しました。ありがとう! – TBZ92

関連する問題