Общий способ преобразовать строку в числовой тип? - PullRequest
0 голосов
/ 07 января 2012

У меня есть этот класс:

template<typename T> class Parser
{
    public:
        Parser() : count(0) {}
        virtual void parse(const string&);
        void get_token(void);
    private:
        T result;
        char token;
        string expression;
        int count;
};

теперь, если бы класс не был универсальным, если бы было result, скажем, double, я бы использовал этот метод для обнаружения чисел.

while((strchr("1234567890.",token))
{
     /* add token to a "temp" string */
     /* etc. etc. */
}

result = atof(temp.c_str());

Но поскольку result является общим, я не могу использовать такие методы, как atof, atoi и т. Д.

Что мне делать?

Ответы [ 3 ]

6 голосов
/ 07 января 2012

Boost имеет встроенную функциональность:

 #include <boost/lexical_cast.hpp>

 void Parser<T>::get_token() {
     std::string token = ...;
     result = boost::lexical_cast<T>(token);
 }

При необходимости добавьте обработку исключений.


Или, возможно, вы не хотите использовать Boost по некоторым причинам:

void Parser<T>::get_token() {
     std::string token = ...;

     std::stringstream ss;
     ss << token;
     ss >> result;
}

Проверьте состояние ошибки ss при необходимости.


Более подробные ответы можно найти по этому связанному вопросу , хотя в нем обсуждаются толькоint конкретно.

1 голос
/ 07 января 2012

Еще один общий шаблон на основе конвертера Numeric To String. Это займет int с и double с.

#include <sstream>
#include <iostream>
#include <string>
using namespace std;

template <class T>
inline std::string Numeric_To_String (const T& t)
{
    std::stringstream ss;
    ss << t;
return ss.str();
}


int main(int argc, char *argv[])
{
   int i = 9;
   double d = 1.2345;
   string s;

  cout <<"Generic Numeric_To_String( anyDatatype ) \n\n";

  s = Numeric_To_String( i );
  cout <<"int i to string    : "<< s <<"   "<< endl; 

  s = Numeric_To_String( d );
  cout <<"double d to string : "<< s <<"   "<< endl;
  cout <<" \n";   

  return 0;
}
0 голосов
/ 07 января 2012

Если у вас есть только полные типы, которые вы хотите проанализировать, вы можете использовать специализацию шаблона:

template<>
void Parser<int>::parse(const string&)
{
    result = atoi(string.c_str());
}

template<>
void Parser<float>::parse(const string&)
{
    result = atof(string.c_str());
}

... Но это работает, только если вы реализуете все необходимые преобразования, конечно.

...