我有一些代码,std::to_string()
是一个变量,其类型是模板参数。假设代码是:
template <typename T>
std::string foo(const T& t) {
return std::string("I got ") + std::to_string(t);
}
现在,有时这个参数需要是void *
;我想在字符串中获取地址,例如"I got 0xdeadbeef"
。没问题,对吧?我应该得到它就像我做std::cout << my_ptr
一样,对吧? ......对我来说不幸的是,事实并非如此。好,
foo()
中使用一条小溪之外,还有什么比为std::to_string
的void*
重叠更好(在std::stringstream
中使用operator<<
)?namespace my_to_str {
using std::to_string;
std::string to_string(void* ptr){
// implement
}
}
现在my_to_str::to_string
可以使用你自己的一组重载进行扩展,比如void*
。
你不能为std::to_string()
重载void*
,所以这没有实际意义。
但你不必使用std::to_string()
。你可以实现自己的,只是回到使用stringstream
:
namespace N {
template <class T>
auto to_string(T const& val, int)
-> decltype(std::to_string(val))
{
return std::to_string(val);
}
template <class T>
std::string to_string(T const& val, ...)
{
std::ostringstream oss;
oss << val;
return val.str();
}
template <class T>
std::string to_string(T const& val) {
return to_string(val, 0);
}
}
这确实允许用你想要的任何细节重载N::to_string()
(例如,如果你想让N::to_string(void* )
做一些特别的事情,只需添加另一个重载)。
您可以为operator+
案例制作自定义void *
:
std::string operator+(const std::string &str, const void *vstr){
return str + std::string(reinterpret_cast<const char *>(vstr));
}