我想写一个模板< T类> T string_to_T(const string& s)将字符串切换为tempate T的函数.T可以是int / double / string,我写一个如下:
template<class T> T Config::string_to_T(const string& s){
T t;
bool at_in = false;
istringstream ist(s);
ist >> t;
return t;
}
但是当字符串中有空格时,它不起作用。 e.g。 string ='1 2 3 4',返回t是 string 类型并且等于4.我如何更改以满足我的需要?
答案 0 :(得分:3)
请参阅boost::lexical_cast
。基本上,你需要专业化
对于>>
不能做你想做的事情。如果你想
string_to_T<std::string>
是一个无操作,例如,你写
专业化:
template<>
std::string
string_to_T<std::string>( std::string const& s )
{
return s;
}
对于更复杂的情况,您可以转发功能 对象,并使用部分特化,但对于你的情况 描述,这不应该是必要的。
当你在这里时,你应该考虑错误
处理。如果你打电话给string_to_T<int>
,会发生什么
输入是“abcd”?就此而言,如果你打电话
string_to_T<int>
"1 2 3 4"
int
,结果为1,或者
错误?
看过你问题的更多评论:你做不到
在运行时更改返回类型(某些非常有限
在a中返回引用或指针时的异常
类层次结构)。 C ++是一种静态类型语言
表达式具有不同的类型,在编译时确定。
假设你可以返回两种不同的类型,你会怎样
使用该函数,编译器如何检测该类型
检测所需的错误。你最接近的是
返回某种代理,隐式转换为
各种类型,但您转换为的类型仍然是
根据你做的事情,静态决定
结果:将其分配给int
,它将转换为class ToStringHelper
{
std::string myValue;
public:
ToStringHelper( std::string const& value )
: myValue( value )
{
}
operator std::string() const
{
return myValue;
}
template <typename T>
operator T() const
{
std::istringstream cvt( myValue );
T results;
cvt >> results;
// Error checking here...
return results;
}
};
ToStringHelper
string_to_T( std::string const& s )
{
return ToStringHelper( s );
}
,
无论字符串的内容如何。
这种类型的安全是一个特点;在编译时检测错误 使代码比延迟错误更加健壮和可靠 检测到运行时。如果你没有这个安全 (非关键应用程序),需要增加灵活性 运行时输入,C ++不是正确的语言;你应该 使用类似Python的东西。
在回应您的评论时,解决方案似乎是 类似的东西:
{{1}}
我将这个确切的模式用于配置数据(有错误 触发异常)。
答案 1 :(得分:0)
您展示的功能是从std::string
转换为T
。您在编译时指定T
,无法在运行时更改它。
如果您希望类型依赖于值,则可以使用Variant。例如,请参阅Boost.Variant(如果您正在使用Qt,则有QVariant)。您还可以使用Boost.Any(difference between Variant and Any)。对于转换,您可能需要使用Boost.Lexical_Cast。您可能需要在变体/ any中指定"1" -> 1
和"1 2 3 4" - > "1 2 3 4"
。请注意,所有这些功能都需要您添加一些代码来处理类型。使用变体,您可以使用visitors,这是一种非常强大的方法来处理变体中的不同类型。
答案 2 :(得分:0)
将任何数据类型转换为字符串的代码:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
template <class T>
string toString(const T& t)
{
std::stringstream ss;
ss << t;
return ss.str();
}
int main(void)
{
string str;
cout<<"Convert any datatype to string\n\n\n";
int i=1234;
str=toString(i );
cout<<"int i= "<<str<<"\n";
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}