tutorial for the boost serialization library 中,它表示“序列化库检测何时要序列化的对象是一个数组”,因此像bus_stop * stops[10]; ar & stops;这样的代码等效于使用for循环for(i = 0; i < 10; ++i) { ar & stops[i]; }

库如何在运行时确定指针stops指向多少个元素?甚至它实际上是一个数组,而不是指向单个对象的指针?我还没有在源代码中找到任何提示。

谢谢!

最佳答案

注意stops不是一个指针,它是一个数组(包含10个指向bus_stop的指针,但这无关紧要)。

数组不是指针。从数组到数组的第一个元素的指针之间存在隐式转换,这在您传递例如包含char参数的函数的char *数组。但是这种转换仅在需要时发生。

如果函数通过引用获取数组,则转换(也称为数组到指针的衰减)当然不会发生,因此参数可以绑定(bind)到参数。换句话说,只需要一个合适的功能模板即可:

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的类型是一个指针。

关于c++ - Boost序列化库如何检测阵列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28899310/

10-11 21:53