Excpetion消息:插入错误值的字符串表示

时间:2016-09-25 14:36:25

标签: c++ string exception casting

如果类型domain_error的{​​{1}}不是有效密钥,我想抛出类型key的异常。 但我不知道如何将任何类型T转换为字符串,只要T被定义,例如T::operator std::string()不支持此。

这显然是错误的,因为它只适用于非常特定的类型:

int

如何做到这一点?

修改

建议使用模板specilisation之后我的解决方案

throw std::domain_error("key error: "+static_cast<std::string>(key));

...

template <class T> std::string to_string(const T t)
    {
        return static_cast<std::string>(t);
    }

    template <> std::string to_string<unsigned int>(const unsigned int i)
    {
        std::stringstream ss;
        std::string ret;
        ss << i;
        ss >> ret;
        return ret;
    }

...

std::string domain_error(const IS& is) const
    {
        using namespace IDTranslator_detail;
        return "key error: "+to_string(is), "error";
    }

1 个答案:

答案 0 :(得分:1)

如上所述,在100%的情况下都无法完成。

您必须指定模板的合同的一部分是,无论哪个类作为参数传递,它必须支持operator std::string

作为合同的一部分,您还可以编写允许的数字类型,并且您将在模板中实现此功能,作为使用std::to_string的专业化。

对于强大的实施,在这种情况下,我会使用SFINAE来尝试std::to_stringoperator std::string,如果两者都失败,请使用一些平淡的标签,例如&#34;未知类型& #34;在异常消息中。也许可以将typeid与我的编译器的demangler一起使用,至少从中获取C ++类型的名称。