如何在C++中将字符串作为模板类返回?

How can I return a string as a template class in C++?

本文关键字:返回 字符串 C++      更新时间:2023-10-16

我想写一个模板<类T>T string_to_T(const string&s)函数,将字符串切换到临时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;
}

但是当字符串中有空格时,它不起作用。例如,字符串 = '1 2 3 4',返回的 t 是字符串类型,等于 4。如何更改以满足我的需求?

请参阅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",结果应为 1,或 错误?

编辑:

看到更多对您的问题的评论:您不能 在运行时更改返回类型(某些非常有限 在 类层次结构)。 C++是一种静态类型语言,每个 表达式具有在编译时确定的独特类型。 假设您可以返回两种不同的类型,您将如何返回 使用该函数,编译器如何检测类型 需要检测错误。 你能来的最接近的是 返回某种代理,隐式转换为 各种类型,但您转换为的类型仍然是 静态确定,根据你用 结果:将其分配给int,它将转换为int, 无论字符串的内容如何。

此类型安全是一项功能;在编译时检测错误 使代码比延迟错误更加健壮和确定 检测到运行时。 如果你能没有这种安全 (非关键应用),并且需要增加灵活性 运行时键入,C++不是正确的语言;你应该是 使用类似Python的东西。

编辑2:

作为对您的评论的回应,解决方案似乎是 大致如下:

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 );
}

我将这种确切的模式用于配置数据(有错误) 触发异常)。

您显示的功能正在从std::string转换为T。在编译时指定T不能在运行时更改它。

如果希望类型依赖于值,可以使用变体。例如,参见 Boost.Variant (如果您正在使用 Qt,则有 QVariant)。您也可以使用 Boost.Any(Variant 和 Any 之间的区别)。对于转换,您可能希望使用Boost.Lexical_Cast。您可能需要在变体/任何中指定自己"1" -> 1"1 2 3 4" - > "1 2 3 4"。请注意,所有这些函数都需要您添加一些代码来处理这些类型。使用变体,您可以使用访问者,这是一种非常强大的方法来处理变体中的不同类型。

将任何数据类型转换为字符串的代码:

#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 stringnnn";
int i=1234;
str=toString(i );
cout<<"int i= "<<str<<"n";

cout<<" nPress any key to continuen";
cin.ignore();
cin.get();
return 0;
}