使 std::to_string 与空指针一起工作,例如 operator<<?
Making std::to_string work with void pointers, like operator<<?
我有一些代码 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
一样得到它,对吧? ... 对我来说不幸的是,事实并非如此。嗯,
- 我 "legitimate" 想让上面的代码像我描述的那样工作吗?
- 除了坚持在
foo()
中使用流之外,还有什么比为 void*
重载 std::to_string
更好的方法(使用 std::stringstream
在那里 operator<<
) ?
您可以为 void *
个案例定制 operator+
:
std::string operator+(const std::string &str, const void *vstr){
return str + std::string(reinterpret_cast<const char *>(vstr));
}
namespace my_to_str {
using std::to_string;
std::string to_string(void* ptr){
// implement
}
}
现在 my_to_str::to_string
可以使用您自己的一组重载进行扩展,例如 void*
。
您不能为 void*
重载 std::to_string()
,所以没有实际意义。
但是您没有使用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* )
做一些特别的事情,只需添加另一个重载).
我有一些代码 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
一样得到它,对吧? ... 对我来说不幸的是,事实并非如此。嗯,
- 我 "legitimate" 想让上面的代码像我描述的那样工作吗?
- 除了坚持在
foo()
中使用流之外,还有什么比为void*
重载std::to_string
更好的方法(使用std::stringstream
在那里operator<<
) ?
您可以为 void *
个案例定制 operator+
:
std::string operator+(const std::string &str, const void *vstr){
return str + std::string(reinterpret_cast<const char *>(vstr));
}
namespace my_to_str {
using std::to_string;
std::string to_string(void* ptr){
// implement
}
}
现在 my_to_str::to_string
可以使用您自己的一组重载进行扩展,例如 void*
。
您不能为 void*
重载 std::to_string()
,所以没有实际意义。
但是您没有使用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* )
做一些特别的事情,只需添加另一个重载).