用std::pair数组初始化std::map问题(指针错误?)
Initializing std::map with an array of std::pairs issue (pointer error?)
我试图理解如何正确初始化私有const std::map
。我研究了这个众所周知的话题,但没有一个答案适合我,因为我被迫使用旧的gcc和boost版本(gcc 4.4, boost 1.41 -> c++ 11功能是有限的,boost::asign::map_list_of不编译),而且,我不想使用类成员函数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);
}
(此示例的完整可执行版本)
如果我取消BOOST_ASSERT宏的注释行,这段代码将不会被编译,因为映射的大小不等于2,这是由于将std::pair<std::string, boost::function<void(void)> > _Mapping[]
传递到CallbackSelector类构造函数的错误。您可以通过查看输出来验证:
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
如果有人能发现这个(显然?)简单的错误,我会很高兴。谢谢你。 没有办法确定数组的大小,只给它一个指针。您可以将大小作为单独的参数传递:
CallbackSelector(std::pair<Arg, Callback> mapping[], size_t size) :
Mapping(mapping, mapping + size)
或将其推断为模板形参:
template <size_t size>
CallbackSelector(std::pair<Arg, Callback> (&mapping)[size]) :
Mapping(mapping, mapping + size)
或者,在c++ 11或更高版本中,您可以使用initializer_list
参数
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}
};
(注意:我冒昧地重命名了_Mapping
,这是一个您不应该使用的保留名称)
相关文章:
- 如何从 std::atomic 中提取指针 T<T>?
- std::vector::迭代器是否可以合法地作为指针
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 编译器不会使用 -std=c++11 编译智能指针
- 我无法使用C++指针指向类方法返回的 std::vector
- std::byte 指针应该用于指针算术吗?
- std::unordered_map::提取引用/指针失效
- 在 c++ 中生成字符串到 std::指针列表的映射
- 通过线程共享 std::指针的矢量
- 将STD ::指针列表与比较器的对象列表
- std::指针和remove_if列表
- 调用具有const键类型引用的std::指针集的count方法
- 搜索指向类的std::指针集
- const传播到std::指针数组
- c++使用std::指针列表对std::vector元素重新排序
- 返回指向std::指针列表的指针时发生ImplicitCast_错误