使std :: to_string与void指针一起工作,比如operator&lt; <! - ?

时间:2016-07-30 12:29:00

标签: c++ string c++11 void-pointers ostream

我有一些代码var input = { "lat": "50.2111", "lon": "18.1233" }; Algorithmia.client("YOUR_API_KEY") .algo("algo://Gaploid/Elevation/0.3.0") .pipe(input) .then(function(output) { console.log(output); });是一个变量,其类型是模板参数。假设代码是:

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

  • 它是合法的&#34;我希望上面的代码能像我描述的那样工作吗?
  • 除了坚持在std::cout << my_ptr中使用流之外,还有什么比为foo()重载std::to_string更好(使用{{1}在那里为void*)?

3 个答案:

答案 0 :(得分:3)

namespace my_to_str {
  using std::to_string;
  std::string to_string(void* ptr){
    // implement
  }
}

现在my_to_str::to_string可以使用您自己的一组重载进行扩展,例如void*

答案 1 :(得分:2)

你不能为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* )做一些特殊的事情,只需添加另一个重载)。

答案 2 :(得分:-1)

您可以为operator+个案件制作自定义void *

std::string operator+(const std::string &str, const void *vstr){
    return str + std::string(reinterpret_cast<const char *>(vstr));
}