На самом деле, главная проблема с &buffer[0]
(обратите внимание на отсутствие парантезов) не в том, что это не очень красиво. (В любом случае, это субъективно. Я помню, что buffer.begin(), buffer.end()
совсем не было симпатичным, когда я впервые научился использовать STL.)
Основная проблема заключается в том, что он вызывает неопределенное поведение всякий раз, когда buffer
пусто - и большая часть кода никогда не проверяет это. Вот почему я положил их в свой набор инструментов:
template <class T, class TAl>
inline T* begin_ptr(std::vector<T,TAl>& v)
{return v.empty() ? NULL : &v[0];}
template <class T, class TAl>
inline const T* begin_ptr(const std::vector<T,TAl>& v)
{return v.empty() ? NULL : &v[0];}
template <class T, class TAl>
inline T* end_ptr(std::vector<T,TAl>& v)
{return v.empty() ? NULL : (begin_ptr(v) + v.size());}
template <class T, class TAl>
inline const T* end_ptr(const std::vector<T,TAl>& v)
{return v.empty() ? NULL : (begin_ptr(v) + v.size());}
Используя их, вы можете написать свой код как
callFunction( begin_ptr(buffer), buffer.size() );
Является ли begin_ptr(buffer)
красивее &buffer[0]
, остается на ваше усмотрение. Однако, учитывая, что NULL
должен проверяться для каждого аргумента функции указателя, это определенно более безопасно.