2015-03-06 1 views
2

В документе tutorial for the boost serialization library говорится, что «библиотека сериализации обнаруживает, когда объект сериализуется, является массивом», и поэтому код bus_stop * stops[10]; ar & stops; эквивалентен использованию цикла for for(i = 0; i < 10; ++i) { ar & stops[i]; }.Как повысить библиотеку сбора сериализации?

Как определить библиотеку во время выполнения, на сколько элементов указывает указатель stops? Или даже, что это фактически массив, а не указатель на один объект? Я еще не смог найти подсказки в исходном коде.

Спасибо!

+0

См., Например, [этот старый вопрос] (http://stackoverflow.com/questions/437150/can-someone-explain-this-template-code-that-gives-me-the-size-of-an-array). –

+0

Переменные на C++ имеют статически известный * тип *, и вы можете писать общий код, который действует по-разному для разных типов. –

ответ

4

Обратите внимание, что stops не является указателем, это массив (из 10 указателей на bus_stop, но это не имеет значения).

Массивы не указатели. Существует неявное преобразование из массива в указатель на первый элемент массива, который происходит, когда вы проходите, например. массив из 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 - указатель.

+1

Спасибо за хорошее объяснение. Но как выглядит шаблон оператора для указателя 'p_stops'? Если бы это была общая реализация, такая как 'template void operator & (T * p)', то оператор '&' является неоднозначным для массива. – cwde

+0

@cwde Да, это было бы так, и нет, это не двусмысленно. Матричный шаблон идеально подходит. Для шаблона на основе указателя требуется преобразование от массива к указателю. Следовательно, шаблон на основе массива является строго лучшим совпадением и поэтому выбран. – Angew

+0

Я просто попробовал это в простом примере кода с массивом из 6 ints. Компилятор (VS10) говорит, что оператор неоднозначен, поскольку он может быть 'operator & (T *)' или 'operator & (T (&) [6])'. – cwde

Смежные вопросы