boost序列化库如何检测数组?
How does boost serialization library detect array?
在 tutorial for the boost serialization library 中它说 "The serialization library detects when the object being serialized is an array" 因此像 bus_stop * stops[10]; ar & stops;
这样的代码等同于使用 for 循环 for(i = 0; i < 10; ++i) { ar & stops[i]; }
.
库如何在运行时确定指针 stops
指向多少个元素?或者甚至它实际上是一个数组而不是指向单个对象的指针?我还没有在源代码中找到任何提示。
谢谢!
请注意 stops
不是指针,它是一个数组(包含 10 个指向 bus_stop
的指针,但这无关紧要)。
数组是不是指针。从 array 到 pointer to the first element of the array 有一个隐式转换,当你传递例如char
数组到需要 char *
参数的函数。但这种转换只会在需要时发生。
如果一个函数通过引用获取数组,转换(也称为数组到指针衰减)当然不会发生,因此参数可以绑定到参数。也就是说,只要有一个合适的函数模板即可:
template <class T, std::size_t N>
void operator & (some_type lhs, T (&array)[N]);
这将只接受数组作为右侧参数。
请注意,如果在您的原始代码中改为这样做:
bus_stop * stops[10];
bus_stop ** p_stops = stops; // decay happens here
ar & p_stops;
那么最后一行将不会调用数组重载。 stops
的类型是数组。 p_stops
的类型是指针。
在 tutorial for the boost serialization library 中它说 "The serialization library detects when the object being serialized is an array" 因此像 bus_stop * stops[10]; ar & stops;
这样的代码等同于使用 for 循环 for(i = 0; i < 10; ++i) { ar & stops[i]; }
.
库如何在运行时确定指针 stops
指向多少个元素?或者甚至它实际上是一个数组而不是指向单个对象的指针?我还没有在源代码中找到任何提示。
谢谢!
请注意 stops
不是指针,它是一个数组(包含 10 个指向 bus_stop
的指针,但这无关紧要)。
数组是不是指针。从 array 到 pointer to the first element of the array 有一个隐式转换,当你传递例如char
数组到需要 char *
参数的函数。但这种转换只会在需要时发生。
如果一个函数通过引用获取数组,转换(也称为数组到指针衰减)当然不会发生,因此参数可以绑定到参数。也就是说,只要有一个合适的函数模板即可:
template <class T, std::size_t N>
void operator & (some_type lhs, T (&array)[N]);
这将只接受数组作为右侧参数。
请注意,如果在您的原始代码中改为这样做:
bus_stop * stops[10];
bus_stop ** p_stops = stops; // decay happens here
ar & p_stops;
那么最后一行将不会调用数组重载。 stops
的类型是数组。 p_stops
的类型是指针。