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

时间:2012-12-01 10:49:56

标签: c++ string templates

我想写一个模板< 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.我如何更改以满足我的需要?

3 个答案:

答案 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的东西。

编辑2:

在回应您的评论时,解决方案似乎是 类似的东西:

{{1}}

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

答案 1 :(得分:0)

您展示的功能是从std::string转换为T。您在编译时指定T无法在运行时更改它。

如果您希望类型依赖于值,则可以使用Variant。例如,请参阅Boost.Variant(如果您正在使用Qt,则有QVariant)。您还可以使用Boost.Anydifference 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;
}