如果类型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";
}
答案 0 :(得分:1)
如上所述,在100%的情况下都无法完成。
您必须指定模板的合同的一部分是,无论哪个类作为参数传递,它必须支持operator std::string
。
作为合同的一部分,您还可以编写允许的数字类型,并且您将在模板中实现此功能,作为使用std::to_string
的专业化。
对于强大的实施,在这种情况下,我会使用SFINAE
来尝试std::to_string
,operator std::string
,如果两者都失败,请使用一些平淡的标签,例如&#34;未知类型& #34;在异常消息中。也许可以将typeid
与我的编译器的demangler一起使用,至少从中获取C ++类型的名称。