使 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 一样得到它,对吧? ... 对我来说不幸的是,事实并非如此。嗯,

您可以为 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* ) 做一些特别的事情,只需添加另一个重载).