2013-10-15 115 views
-3

我有一個以字符串作爲密鑰並存儲lambda的映射。爲std :: map生成唯一密鑰

我到目前爲止已經試過

std::map <int, auto> callbackMap 

並把一個lambda那裏沒有一個相同數量了。這可能嗎 ?我不斷收到錯誤,說函數不能有自動作爲構造函數。

+6

'1','2','3'等都是唯一的鍵。他們幫助你嗎?如果不是,爲什麼?你想解決什麼問題? – Nawaz

+0

std :: map只接受每個鍵的一個值,所以剛剛從'0'開始並增加? – Smash

+2

你的問題不清楚。我建議你在獲得降低成功之前重新制定它... –

回答

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),但你可以定義當然,你所希望的方式)。

如果你決定存儲「指向函數的指針」,你將會遇到同樣的問題。你必須知道簽名!沒什麼不同。

+0

有沒有一種方法來存儲一個通用的lambda,我的原始解決方案是每個lambda有一個靜態成員,但我覺得非常錯誤。 –

+0

你總是可以嘗試'void *',但你顯然需要用這種方式來管理自己的內存。除非所有的lambda具有相同的調用約定,否則參數和參數都是一樣的。然後你可以使用'std :: function <>'作爲這個答案最初的說法。 –

+0

「有沒有辦法存儲一個通用的lambda?」我編輯了答案,請再讀一遍。我希望它能幫助你! –