我的项目有遗留库,将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();
}
我的工作环境是 Windows中的Visual Studio 2008 sp1
提前致谢。
答案 0 :(得分:1)
由于您只需要与旧版本库交互的新行为而不在所有代码中(例如strlen()
如果传递null将会中断指向它的最佳选择是使用效用函数来提供正确的行为。
像你建议的那样:
const wchar* GetStringBody( const std::string& str )
{
if( str.empty() ) {
return 0;
}
return str.c_str();
}
并在必要时将其称为 。
答案 1 :(得分:0)
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+长度字符串返回正确的指针。