2013-04-14 73 views
0

例如,我有这样的代码,它把来自串数:如何根据内部代码更改返回类型? (字符串数转换)

#include <sstream> 

template <typename T> 
T string_to_num(const string &Text, T defValue = T()) 
{ 
    stringstream ss; 
    for (string::const_iterator i=Text.begin(); i!=Text.end(); ++i) 
     if (isdigit(*i) || *i=='e' || *i=='-' || *i=='+' || *i=='.') 
      ss << *i; 
    T result; 
    return ss >> result ? result : defValue; 
} 

问题是它需要两个参数,第二这使得它的线索数目的什么类型的我我正在返回(一个int或一个浮点数等)。

我该如何做到这一点,如果该字符串包含一个小数'。'它返回一个十进制数据类型(例如float),否则返回一个完整的数据类型(例如int)?

除非有人有更好的代码,他们可以共享这样做..?

+2

那是不可能的。字符串是一个运行时值,而类型是在编译时本身确定的。不过你可以使用boost :: any。 – Nawaz

+0

或'boost :: variant',如果你有一组有限的类型。或者,您可以使用其中一种类型来调用函子。 – Yakk

+0

您必须知道类型并调用函数:'strint_to_num (“2.3”);'。删除函数的第二个参数,因为它是多余的。 – iammilind

回答

0

问题是为什么你需要这个。我想你想的那样,只是为了呼吁string_to_num之前摆脱指示类型:

????? number = string_to_num<double>("123.21"); 
^^^^^ 
do_something(number); 

但是,你已经被<double>指示类型。一个简单的语法糖,auto是你想要的。 (它的编译时间)

否则,你需要一个变种类型,并从string_to_num定义远远。它有很多开销。

你的代码已经OK了,输出基于T。所以,在真正的节目中你没有问题。

+0

最后一句话,这个问题下的评论是值得的。 – deepmax

+0

如果OP提供一个参数,编译器可以从中推导出模板参数,则不需要用“”明确指定它。也许他只是不知道明确指定类型是可能的,所以我认为你回答了他们的问题。 –

相关问题