如何在C++中将字符串作为模板类返回?
How can I return a string as a template class in C++?
我想写一个模板<类T>T string_to_T(const string&s)类T>函数,将字符串切换到临时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;
}
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C 字符串返回字符串的整数/双精度/长整型值
- 如何从COM模块中的函数返回字符串数组?
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- 我如何在函数 cpp 中返回字符串
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 格式化返回字符串C++
- 返回字符串vs通过引用传递字符串以更新值
- 如何在不使用 STL 的情况下从函数反转字符串后返回字符串C++?
- 使用 ctypes 从函数返回字符串C++会给出大的 int,而不是 char 指针
- 从 C++ 中的模板函数返回字符串和整数
- 返回字符串的散点回文计数
- C++重载字符串 [] 运算符以返回字符串和
- 返回字符串和不同向量数据类型的映射C++
- 字符串函数不返回字符串? C++
- 从函数返回字符串C++错误
- 如何在返回字符串的函数中不忽略void值
- 我想将字符串转换为 Json 格式并返回字符串向量作为答案
- C - 返回字符串时的分割故障
- 使用向量和字符串函数返回字符串