C++ 使用std::pairs数组初始化std::map问题(指针错误?)

C++ 使用std::pairs数组初始化std::map问题(指针错误?),c++,pass-by-reference,stdmap,C++,Pass By Reference,Stdmap,我试图理解如何正确初始化私有常量std::map。我研究过一个著名的话题,但没有一个答案适合我,因为我不得不使用旧的gcc和boost版本(gcc 4.4,boost 1.41->C++11功能有限),而且,我不想使用类成员函数进行std::map初始化,因为在对象构造时需要在类之外进行初始化 但是,std::map有一个重载构造函数,它接受两个迭代器(我也是受线程启发的),这是我的解决方法: template <typename Arg, typename Callback> cl

我试图理解如何正确初始化私有常量std::map。我研究过一个著名的话题,但没有一个答案适合我,因为我不得不使用旧的gcc和boost版本(gcc 4.4,boost 1.41->C++11功能有限),而且,我不想使用类成员函数进行std::map初始化,因为在对象构造时需要在类之外进行初始化

但是,
std::map
有一个重载构造函数,它接受两个迭代器(我也是受线程启发的),这是我的解决方法:

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);
}
模板
类回调选择器
{
私人:
常量std::map

如果我用BOOST_ASSERT宏取消注释该行,则不会编译此代码,因为将
std::pair _Mapping[]
传递到CallbackSelector类构造函数时出错,导致映射大小不等于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
int main()中的sizeof映射80// 尺寸(标准::对)40 CallbackSelector构造函数中的sizeof _映射8// sizeof(std::pair)40//数组大小减少了十倍

如果有人能发现这个(显然是?)简单的错误,我会很高兴。谢谢。

如果只给数组一个指针,就无法确定数组的大小。您可以将大小作为单独的参数传递:

CallbackSelector(std::pair<Arg, Callback> mapping[], size_t size) :
    Mapping(mapping, mapping + size)

(注意:我冒昧地重命名了
\u Mapping
,这是一个您不应该使用的映射)。

关于大小,
\u Mapping[]
作为函数参数只是一个指针。感谢您提供了一个令人惊讶的答案。最后一个选项甚至适用于我的旧gcc 4.4.7。如果您不介意的话,我将在您的代码示例中添加模板定义。我过去曾使用模板技巧来传递数组大小。效果非常好。
template <size_t size>
CallbackSelector(std::pair<Arg, Callback> (&mapping)[size]) :
    Mapping(mapping, mapping + size)
CallbackSelector(std::initializer_list<std::pair<Arg, Callback>> mapping) :
    Mapping(mapping.begin(), mapping.end())

// Usage example
CallbackSelector<std::string, boost::function<void(void)> > selector {
    {arg1, callback1}, 
    {arg2, callback2}
};