У меня есть класс шаблона, полученный из 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)
называется.
Сопряжения типа String с типом шаблона.
Вызывается оператор базового класса (basic_stringstream
). (Или std::operator...
)
Результат:
Inspecting: {_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 stock 'stringstream' сделал это уже для вас – Mgetz
Я не совсем понимаю, какова фактическая проблема из вашего описания.Моя первая мысль заключается в том, что вы должны посмотреть на специализацию шаблона [http://www.cprogramming.com/tutorial/template_specialization.html] –
@Mgetz Есть 'std :: stringstream' и' std :: wstringstream', я бы хотел «объединить» их с дополнительными функциями, которые здесь не отображаются. – Blacktempel