开发者

How do I add to a wstring?

开发者 https://www.devze.com 2023-01-28 14:12 出处:网络
This works with std::string std::string class::something(char* input) { std::string s(input); s = \"hai! \" + s;

This works with std::string

std::string class::something(char* input) {
    std::string s(input);
    s = "hai! " + s;
    return s;
}

But fails if I try the same thing w开发者_JAVA百科ith wstring

std::wstring class::something(wchar_t* input) {
    std::wstring s(input);
    s = "hai! " + s;
    return s;
}

How do I do the same thing with std::wstring?


The problem here is types. A wstring isn't a string, but a quoted string constant is related to it (it is generally a const char*), so

s = "hai! " + s;

is actually a problem.

The value "hai! " is of type const char*, not type const wchar_t*. Since const char* is a basic type, it's searching for a global operator+ that operates const char* and wstring, which doesn't exist. It would find one for const wchar_t* and wstring, because std::basic_string<T>, the template underyling type for both string and wstring (using char and wchar_t as the type parameter, respectively) also creates template methods for operator+ (const T*& s1, const basic_string<T> s2) so that addition can work.

Therefore, you need to make "hai! " a wstring:

std::wstring class::something(wchar_t* input){
    std::wstring s(input);
    s = L"hai! " + s;
    return s;
}

The L prefix on a string constant, in Visual C++, defines it to be "long", and therefore a wstring. wstring is actually basic_string<wchar_t>, which is, because of the behavior of C++ templates, a completely different type from basic_string<char> (a std::string), so you can't combine the two.


You use a wide character literal instead of a char character literal by prefixing "hai!" with L.


Instead of having 2 versions of the code (1 for wide and 1 for multi-byte):

#ifdef _UNICODE
    typedef std::wstring tstring;
    typedef wchar_t tchar;
#   define TEXT(s) L##s
#else
    typedef std::string tstring;
    typedef char tchar;
#   define TEXT(s) s
#endif

tstring class::something(tchar* input) 
{
    tstring s(input);
    s = TEXT("hai! ") + s;
    return s;
}

This prevents having to rewriting code when you change your compiler string encoding compiler options.

0

精彩评论

暂无评论...
验证码 换一张
取 消