Может ли STL string :: c_str () возвращать NULL, когда у него нет строки? - PullRequest
1 голос
/ 22 октября 2010

В моем проекте есть устаревшая библиотека, в которой указатель NULL рассматривается как пустая строка.

Но когда я получаю возвращаемые данные из std :: wstring, как это,

std::wstring strData;
const wchar* pStr = strData.c_str();
ASSERT(NULL == pStr);  // ASSERT!!

pStr не NULL, ауказатель на точку wstring.

Могу ли я заставить std :: string возвращать NULL, когда у него нет строковых данных?Теперь я обертываю каждую переменную-член str следующим образом:

const wchar* GetName() {    // I hate this kinds of wrapping function
    if (m_Name.empty())
    {
        return NULL;
    }
    return m_Name.c_str();
}

Моя рабочая среда - Visual Studio 2008 sp1 в Windows

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Поскольку вам нужно только это новое поведение для взаимодействия с этой устаревшей библиотекой и не во всем коде (например, strlen() прервется, если вы передадите в него нулевой указатель)Лучше всего использовать служебную функцию для обеспечения правильного поведения.

Что-то вроде того, что вы предложили:

const wchar* GetStringBody( const std::string& str )
{
    if( str.empty() ) {
         return 0;
    }
    return str.c_str();
}

и вызывать ее , где необходимо .

0 голосов
/ 05 января 2014
template <typename Char_t, typename Traits_t, typename Allocator_t>
inline const Char_t* StrPtr(const std::basic_string<Char_t, Traits_t, Allocator_t>& aString) {
    return (aString.empty() || !aString.front()) ? nullptr : aString.c_str();
}

template <typename Char_t>
inline const Char_t* StrPtr(const Char_t* aString) {
    return (!aString || !*aString) ? nullptr : aString;
}

Используйте эти общие функции для преобразования строк в указатели. Все строки NULL или empty() / "" возвращают nullptr, тогда как любые строки длиной 1+ возвращают правильный указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...