Какой самый чистый метод для простого управления областью массива в C ++ 11 - PullRequest
1 голос
/ 23 февраля 2012

Я ищу чистый способ управления областью действия массивов с использованием новых шаблонов указателей, представленных в C ++ 11, типичный сценарий здесь - при вызове функций API Win32.хотя есть много дискуссий по более сложным вопросам, этот относительно простой сценарий, кажется, не обсуждался, и мне интересно, есть ли лучшие варианты, чем то, что я сейчас начинаю делать.

1 Ответ

11 голосов
/ 23 февраля 2012

Самый простой способ - использовать std::vector, даже C ++ 98 гарантирует, что он совместим с массивами в стиле C (т. Е. Он хранится как один непрерывный блок), все, что вам нужно, это передать указатель на первый элементна ваш Win32ApiFunction.

std::vector<char> data(size);
Win32ApiFunction(&data[0], &size);

В C ++ 11 есть специальная функция-член std::vector<T>::data(), которая возвращает указатель на начало массива (поэтому вам не нужно беспокоиться о перегруженных operator& () для типа векторного значения и использования std::addressof, см. Как я могу надежно получить адрес объекта, когда оператор & перегружен? для проблем C ++ 98 с operator&() перегрузкой).

...