文字列をキーとしてラムダを格納するマップがあります。
私はこれまで試してきました
std::map <int, auto> callbackMap
そして、同じ番号のラムダがない場所にラムダを配置します。これは可能ですか?関数は auto をコンストラクターとして使用できないというエラーが表示され続けます。
文字列をキーとしてラムダを格納するマップがあります。
私はこれまで試してきました
std::map <int, auto> callbackMap
そして、同じ番号のラムダがない場所にラムダを配置します。これは可能ですか?関数は auto をコンストラクターとして使用できないというエラーが表示され続けます。
これauto
は、必要な型を非常に定義された型に変換するコンパイル時の「機能」にすぎないためです。「バリアント」タイプと混同している可能性があります...このようには機能しません。
auto X = 3;
X
「変種」という意味ではありません。コンパイラがそれを次のように変換するようなものです。
int X = 3;
X
したがって、非常に定義された型があることに注意してください。
関数 ( lambda は演算子) をマップに保存できますが、問題ありません。しかし、あなたのstd::function<...>
非常に定義されたもので。例:
std::map< int, std::function< int( int ) > > callbackMap;
callbackMap[ 0 ] = std::function< int( int ) >( [] ( int a ) { return a + 1; } );
callbackMap[ 1 ] = std::function< int( int ) >( [] ( int a ) { return a - 1; } );
callbackMap[ 2 ] = std::function< int( int ) >( [] ( int a ) { return a * 2; } );
callbackMap[ 3 ] = std::function< int( int ) >( [] ( int a ) { return a / 2; } );
関数のシグネチャを知る必要があることに注意してください...(ここでは私の例int( int a )
ですが、もちろん好きなように定義できます)。
「関数へのポインタ」を保存することにした場合、同じ問題が発生します。署名を知っておく必要があります。違いはありません。