类型转换问题 求助
做了一个转换类, 但是比如说是字符串 中间有空格 就会在空格前截断, 但是如果不用模板类声明 w/stringstream 就是正常的//根据数据类型 自动选择 stream 的类型是 stringstream 还是 wstringstream
//比如说函数的返回值是wstring, CStringW, wchar_t*, 那么 stream的类型应该是wstringstream
// 那么否则 是string CStringA, char* stream的类型应该是stringstream
#include <string>
#include <iostream>
#include <sstream>
template<typename T>
struct convert_string {
typedef std::stringstream type;
};
template<>
struct convert_string<wchar_t*> {
typedef std::wstringstream type;
};
template<>
struct convert_string<const wchar_t*> {
typedef std::wstringstream type;
};
template<>
struct convert_string<std::wstring > {
typedef std::wstringstream type;
};
template<>
struct convert_string<const std::wstring > {
typedef std::wstringstream type;
};
template <typename TRet, typename TParam>
inline TRet Convert(const TParam& t)
{
typename convert_string<TRet>::type stream;
TRet tRet;
stream << t;
stream >> tRet;
return tRet;
}
int main()
{
using namespace std;
const char* pmsg = "hello world";
std::stringstream a;
std::wstringstream b;
auto ret = Convert<std::string, const char*>(pmsg);
auto nex = Convert<std::wstring>(L"WH AT");
std::cout << ret;
Convert<string>("12 34");
Convert<string>("hello world");
Convert<string>(L"1234");
Convert<int>("1234");
Convert<int>(L"1234");
Convert<wstring>("2234");
Convert<wstring>(L"1234");
Convert<string>(3.15);
Convert<wstring>(L"1234");
return 0;
}
没看懂你的问题,把两个代码都贴出来
一个没问题的和一个有问题的,然后说明你的问题
人造人 发表于 2022-9-29 20:47
没看懂你的问题,把两个代码都贴出来
一个没问题的和一个有问题的,然后说明你的问题
就是下面 Convert<string>("12 34"); 只会转换12,34丢了 pediyzhi 发表于 2022-9-30 08:13
就是下面 Convert("12 34"); 只会转换12,34丢了
这不是很正常么?
你的意思是 你的另外一个代码可以把12,34都转换了?
贴出来看看
pediyzhi 发表于 2022-9-30 08:13
就是下面 Convert("12 34"); 只会转换12,34丢了
但是如果不用模板类声明 w/stringstream 就是正常的
你把 不用模板类声明 w/stringstream 的版本发出来看看
人造人 发表于 2022-9-30 08:41
但是如果不用模板类声明 w/stringstream 就是正常的
你把 不用模板类声明 w/stringstream 的版本发出来 ...
不是, 我的意思是, 如果是字符串的话Hello Word 也只会有Hello . pediyzhi 发表于 2022-10-2 07:29
不是, 我的意思是, 如果是字符串的话Hello Word 也只会有Hello
看不懂你的问题 pediyzhi 发表于 2022-10-2 07:29
不是, 我的意思是, 如果是字符串的话Hello Word 也只会有Hello
你不是说 不用模板类声明 w/stringstream 就是正常的 么?
你把这个正常的代码发出来看看
人造人 发表于 2022-10-2 11:20
你不是说 不用模板类声明 w/stringstream 就是正常的 么?
你把这个正常的代码发出来看看
好奇怪. 我现在正常的也不正常了.{:10_277:} 题在第41行
stream流在传递给tRet的时候,默认只传递第一个空格前的内容,可以考虑使用循环
借用一个临时变量tf 或许可以这么写:
TRet tf;
while(stream >> tf) {
tRet += tf;
tRet += ' '; //保留空格
} 这段代码有一个问题,它在处理带空格的字符串时会截断空格之前的部分。这是因为默认情况下`operator>>`会停止在空格处。要解决这个问题,可以使用`std::getline()`函数而不是`operator>>`来读取输入,因为它可以读取整行文本,包括空格。
以下是修改后的示例代码:
#include <string>
#include <iostream>
#include <sstream>
template<typename T>
struct convert_string {
typedef std::stringstream type;
};
template<>
struct convert_string<wchar_t*> {
typedef std::wstringstream type;
};
template<>
struct convert_string<const wchar_t*> {
typedef std::wstringstream type;
};
template<>
struct convert_string<std::wstring > {
typedef std::wstringstream type;
};
template<>
struct convert_string<const std::wstring > {
typedef std::wstringstream type;
};
template <typename TRet, typename TParam>
inline TRet Convert(const TParam& t)
{
typename convert_string<TRet>::type stream;
TRet tRet;
// 读取整行文本
std::getline(stream, tRet);
return tRet;
}
int main()
{
using namespace std;
const char* pmsg = "hello world";
std::stringstream a;
std::wstringstream b;
auto ret = Convert<std::string, const char*>(pmsg);
页:
[1]