lexical_cast c ++

时间:2013-04-02 21:17:15

标签: c++ wrapper lexical-cast

我们如何编写一个包装器词法转换函数来实现如下行:

int value = lexical_cast<int> (string)

我对编程很陌生,想知道如何编写函数。我不知道如何找出一个模板。我们也可以为double编写一个包装函数吗?喜欢

double value = lexical_cast2<double> (string)

...

4 个答案:

答案 0 :(得分:6)

按照你在例子中说明的那样拥有它:

#include <sstream>

template <class Dest>
class lexical_cast
{
    Dest value;
public:
    template <class Src>
    lexical_cast(const Src &src) {
        std::stringstream s;
        s << src;
        s >> value;
    }

    operator const Dest &() const {
        return value;
    }

    operator Dest &() {
        return value;
    }
};

包括错误检查:

    template <class Src>
    lexical_cast(const Src &src) throw (const char*) {
        std::stringstream s;
        if (!(s << src) || !(s >> value) || s.rdbuf()->in_avail()) {
            throw "value error";
        }
    }

答案 1 :(得分:1)

你可以尝试这样的事情:

#include <sstream>
#include <iostream>

template <class T>
void FromString ( T & t, const std::string &s )
{
    std::stringstream str;
    str << s;
    str >> t;
}

int main()
{
   std::string myString("42.0");

   double value = 0.0;

   FromString(value,myString);

   std::cout << "The answer to all questions: " << value;

   return 0;
}

答案 2 :(得分:1)

如果这不是一个例外,如果您的目标只是将字符串转换为其他类型:

如果您使用的是C ++ 11,则会有新的转换函数。

所以你可以做点什么

std::stoi -> int
std::stol -> long int
std::stoul -> unsigned int
std::stoll -> long long
std::stoull -> unsigned long long
std::stof -> float
std::stod -> double
std::stold -> long double 

http://www.cplusplus.com/reference/string/

如果不是C ++ 11,你可以使用

int i = atoi( my_string.c_str() )
double l = atof( my_string.c_str() );

答案 3 :(得分:0)

您可以简单地使用this标头。并撰写to<std::string>(someInt)to<unsigned byte>(1024)等内容。第二部分将告诉你,你做的很糟糕。