C ++将int转换为字符串内联

时间:2014-12-09 14:21:11

标签: c++ string data-conversion

我的问题似乎非常基本,但我无法找到解决方案。我需要编写一个代码,通过报告异常抛出的行和位置来帮助调试。问题是__LINE__int值,我在使用std::string(line)的以下代码中将其转换为字符串时遇到问题:

#pragma once

#include <stdexcept>
#include <cstring>


class CRuntime_error_line: public std::runtime_error
{
public:
    CRuntime_error_line(const char * msg, const char * file,int line)
        :runtime_error(std::string(msg)+" @"+":"+std::string(line)){}
};

#define runtime_error_line(msg) CRuntime_error_line(msg,__FILE__,__LINE__)

似乎std::string(line)无法将int转换为字符串,其他在线建议的解决方案无法在线实现,我不知道如何在第二行调用基础构造函数!

编译器输出:

  

log.h:在构造函数'CRuntime_error_line :: CRuntime_error_line(const   char *,const char *,int)':log.h:10:124:错误:转换无效   从'int'到'const char *'[-fpermissive] CRuntime_error_line(const   char * msg,const char * file,int   line):runtime_error(std :: string(msg)+“@”+“:”+ std :: string(line)){}

(使用g ++和linux环境)

修改

应该以这种方式调用宏:

throw runtime_error_line("Invalid somethihng ...!");

3 个答案:

答案 0 :(得分:3)

正如Borgleader std::to_string建议的那样,是您的解决方案。它还会为您构建一个临时std::string,因此无需从msg构建临时字符串:

#pragma once

#include <stdexcept>
#include <cstring>
#include <string> // Add this to support std::to_string


class CRuntime_error_line: public std::runtime_error
{
public:
    CRuntime_error_line(const char* msg, const char* file, int line)
        : runtime_error(msg + " @:"s + std::to_string(line)){} // Use std::to_string here
};

#define runtime_error_line(msg) CRuntime_error_line(msg, __FILE__, __LINE__)

如果没有C ++ 11,你仍然可以做到这一点,它不是那么干净:

#pragma once

#include <stdexcept>
#include <cstring>
#include <sstream> // Use to include std::ostringstream    

class CRuntime_error_line: public std::runtime_error
{
public:
    CRuntime_error_line(const char* msg, const char* file, int line)
        : runtime_error(static_cast<std::ostringstream&>(std::ostringstream() << msg << " @:" << line).str()){} // Use std::ostringstream here
};

#define runtime_error_line(msg) CRuntime_error_line(msg, __FILE__, __LINE__)

答案 1 :(得分:1)

这种情况可能更好:

#define STRING_DEFINE1(x) #x
#define STRING_DEFINE(x) STRING_DEFINE1(x)
...
CRuntime_error_line(msg,__FILE__,STRING_DEFINE(__LINE__))

答案 2 :(得分:1)

我能想到的最简单的事情就是自己写一个to_string

#include <sstream>

std::string to_string(int i)
{
    std::ostringstream os;
    os << i;
    return os.str();
}

然后像其他人建议的那样打电话。