I am trying to understand how to initialize private const std::map properly. I have studied this well-known topic but none of the answers was suitable for me, because I am forced to use old gcc and boost versions (gcc 4.4, boost 1.41 -> C++11 features are limited, boost::asign::map_list_of does not compile) and, moreover, I don't want to use class member function for std::map initialization due to need of doing that outside the class at the time of the object construction.  
However, there is overloaded constructor for std::map that accepts two iterators (this thread inspired me too), and this is my workaround:
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)
If I uncomment the line with BOOST_ASSERT macro, this code will not be compiled, because the size of Mapping is unequal to 2 due to an error of passing the std::pair<std::string, boost::function<void(void)> > _Mapping[] into the CallbackSelector class constructor. You can verify this by looking at the output:
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
I'll be glad if someone could find this (apparently?) simple mistake. Thank you.
 
     
    