-3

文字列をキーとしてラムダを格納するマップがあります。

私はこれまで試してきました

std::map <int, auto> callbackMap

そして、同じ番号のラムダがない場所にラムダを配置します。これは可能ですか?関数は auto をコンストラクターとして使用できないというエラーが表示され続けます。

4

1 に答える 1

2

これ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 )ですが、もちろん好きなように定義できます)。

「関数へのポインタ」を保存することにした場合、同じ問題が発生します。署名を知っておく必要があります。違いはありません。

于 2013-10-15T18:33:26.873 に答える