我想了解如何初始化私有const std::map
正確。我研究了this着名的話題,但沒有一個答案適合我,因爲我不得不使用舊的gcc和boost版本(gcc 4.4,boost 1.41 - > C++ 11功能有限,boost::asign::map_list_of does not compile),而且,因爲在構造對象時需要在類之外進行,所以我不想使用類成員函數進行std :: map初始化。用std :: pairs數組初始化std :: map問題(指針錯誤?)
然而,過載構造函數std::map
接受兩個迭代器(this線程啓發了我太多),這是我的解決辦法:
template <typename Arg, typename Callback>
class CallbackSelector
{
private:
const std::map<Arg, Callback> Mapping;
public:
CallbackSelector(std::pair<Arg, Callback> _Mapping[]):
Mapping(_Mapping, _Mapping + sizeof(_Mapping)/sizeof(std::pair<Arg, Callback>))
{
//BOOST_ASSERT(sizeof _Mapping)/(sizeof (std::pair<Arg, Callback>)) == 2);
std::cout << "sizeof _Mapping " << sizeof _Mapping << std::endl;
std::cout << "sizeof (std::pair<Arg, Callback>) " << sizeof (std::pair<std::string, boost::function<void(void)> >) << std::endl;
};
};
void PamEvent() {}
void DefaultEvent() {}
int main(int argc, char** argv)
{
std::pair<std::string, boost::function<void(void)> > _Mapping[] =
{
std::make_pair("pam:", boost::bind(&PamEvent)),
std::make_pair("none", boost::bind(&DefaultEvent))
};
std::cout << "sizeof _Mapping " << sizeof _Mapping << std::endl;
std::cout << "sizeof (std::pair<Arg, Callback>) " << sizeof (std::pair<std::string, boost::function<void(void)> >) << std::endl;
CallbackSelector<std::string, boost::function<void(void)> > Selector(_Mapping);
}
(The full executable version of this example)
如果我取消了符合BOOST_ASSERT宏,因爲將std::pair<std::string, boost::function<void(void)> > _Mapping[]
傳入CallbackSelector類構造函數的錯誤導致Mapping的大小不等於2,所以不會編譯此代碼。您可以通過查看輸出來驗證:
sizeof _Mapping 80 //in the int main()
sizeof (std::pair<Arg, Callback>) 40
sizeof _Mapping 8 //in the CallbackSelector constructor
sizeof (std::pair<Arg, Callback>) 40 //the array size has decreased tenfold
我會很高興,如果有人能找到這個簡單的錯誤(顯然?)。謝謝。
關於大小,'_Mapping []'作爲函數參數只是一個指針。 – juanchopanza