2017-03-17 64 views
1

我創建地圖一個函數指針如示於下面的最小工作實例:將新元素推入函數指針映射「inline」?

#include <iostream> 
#include <map> 
#include <vector> 

using namespace std; 

typedef std::vector<bool > Bar; 
typedef bool (*Foo)(Bar b); 
typedef std::map<int, Foo > MapOfFunctions; 

inline bool f1 (Bar b) { return b[0] && b[1]; } 

int main() { 
    MapOfFunctions myMap; 

    myMap[0] = f1; // works 
    //myMap[1] = // Define a function right here, "in line"?! 

    if (myMap[0](Bar (2,true))) 
    cout << "it's true" << endl; 

    return 0; 
} 

我想知道是否有可能定義地圖「內聯」的新的元件(即功能) ,即在代碼中,而不必先在代碼的其他地方創建一個單獨的函數(本例中爲f1)。

編輯:該解決方案應該最好是C++ 98。

回答

4

是,captureless lambda表達式可以轉化爲函數指針:

myMap[3] = [](Bar) { return false; }; 
myMap[7] = [](Bar b) -> bool { b.clear(); return b.size(); }; 
+0

怎麼樣C++ 98的解決方案?看起來這是一個C++ 11功能。對不起,在OP中沒有提到這個要求。 –

+0

@space_voyager:不,對不起。 –

+0

@space_voyager,'boost :: function'包含'boost :: bind'結果或'Boost.Phoenix' lambas。 – chris