我已经从std::basic_stringstream<typename TString::value_type...>
得到了一个模板类,如你所见。试图转换它们时发生问题。这可能是一个明显的问题,但我似乎无法找出解决方案。自定义Stringstream - 转换std :: wstring&std :: string
以main
为例,我有一个简单的std::wstring
并用L"123"
对它初始化。
在构建std::wstring
之后,调用自定义类basic_stringstream
的操作员(取决于std::wstring
或std::string
)。
检查WCStringStream
对象以进行调试,显示它包含 - 而不是字符串L"123"
,它是输入字符串的第一个元素的地址。功能to_bytes
和from_bytes
做返回正确的转换后的字符串,那么剩下的唯一问题是,运营商被称为在两个运营商的功能:
*this << std::wstring_convert<...>().xx_bytes(s);
例子:
模板类std::wstring
。
输入是std::string
。
&operator<<(const std::string &s)
正在被调用。
转换字符串。
&operator<<(const std::wstring &s)
正在被调用。
字符串类型与模板类型匹配。
调用基类(basic_stringstream
)的运算符。 (或者std::operator...
)
结果:
检查:{_Stringbuffer={_Seekhigh=0x007f6808 L"003BF76C췍췍췍췍췍췍췍췍췍...}...}
WCStringStream<std::wstring>::str()
- >"003BF76C"
预期结果:
"123"
这里怎么回事?
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#include <Windows.h>
#include <iostream>
#include <sstream>
#include <codecvt>
template<class TString>
class WCStringStream : public std::basic_stringstream<typename TString::value_type,
std::char_traits<typename TString::value_type>,
std::allocator<typename TString::value_type> >
{
typedef typename TString::value_type CharTraits;
typedef std::basic_stringstream<CharTraits, std::char_traits<CharTraits>, std::allocator<CharTraits> > MyStream;
//more typedefs...
public:
//Constructor...
inline WCStringStream(void) { }
inline WCStringStream(const TString &s) : MyStream(s) { }
//and more...
//operator>> overloads...
//defines for VS2010/2015 (C++11) included
inline WCStringStream &operator<<(const std::wstring &s)
{
if (typeid(TString) == typeid(s))
MyStream::operator<<(s.c_str());
else
*this << std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t>().to_bytes(s);
return *this;
}
inline WCStringStream &operator<<(const std::string &s)
{
if (typeid(TString) == typeid(s))
MyStream::operator<<(s.c_str());
else
*this << std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t>().from_bytes(s);
return *this;
}
};
//Example main
int main(int argc, char *argv[])
{
typedef std::wstring fstring;
WCStringStream<std::wstring> ws;
WCStringStream<std::string> ss;
ws << fstring(L"123");
int a = 0;
ws >> a;
std::cout << a << std::endl;
ss << fstring(L"123");
int b = 0;
ss >> b;
std::cout << b << std::endl;
return 0;
}
我目前正在编纂VS2015,但我需要它VS2010太运行。
我可以发誓VS2010/2015s股票'stringstream'已经为你做了这个 – Mgetz
我不完全清楚你的描述中的实际问题是什么。我的第一个想法是,你应该看看模板专业化[http://www.cprogramming.com/tutorial/template_specialization.html] –
@Mgetz有'std :: stringstream'和'std :: wstringstream',我想将它们与这里未显示的附加功能“组合”。 – Blacktempel