Как я могу изменить строку C ++ runtime_error? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть класс, который наследуется от std::runtime_error примерно так:

#include <string>
#include <stdexcept>

class SomeEx : public std::runtime_error
{
public:
    SomeEx(const std::string& msg) : runtime_error(msg) { }
};

Сказано, что msg всегда будет что-то вроде "недопустимого идентификатора типа 43".Есть ли способ построить эту «какую строку» с помощью другого конструктора (или другого метода), чтобы я указывал только целочисленный идентификатор типа?Что-то вроде:

SomeEx(unsigned int id) {
    // set what string to ("invalid type ID " + id)
}

Ответы [ 4 ]

5 голосов
/ 14 февраля 2012
static std::string get_message(unsigned int id) {
    std::stringstream ss;
    ss << "invalid type ID " << id;
    return ss.str();
}
SomeEx(unsigned int id) 
    : runtime_error(get_message(id)) 
{}

не имеет отношения: причина, по которой мы имеем строку .what(), заключается в том, что люди перестают использовать номера ошибок.

2 голосов
/ 14 февраля 2012

Конечно: SomeEx(unsigned int id) : runtime_error(std::to_string(id)) { }

0 голосов
/ 16 июня 2018

Добавим к ответу Mooing Duck, что в настоящее время вы можете использовать лямбду и прямо называть ее так:

SomeEx(unsigned int id) :
    std::runtime_error {
        [](const auto id) {
            std::ostringstream ss;

            ss << "invalid type ID " << id;
            return ss.str();
        }(id)
    }
{
}
0 голосов
/ 14 февраля 2012

Если вы можете преобразовать число в строку, вы можете просто добавить их:

#include <string>
#include <stdexcept>

std::string BuildMessage(std::string const&  msg, int x)
{
    std::string result(msg);

    // Build your string here
    return result;
}

class SomeEx : public std::runtime_error
{
    public:
        SomeEx(const std::string& msg)
            : runtime_error(BuildMessage(msg, id)) { }
};
...