使std :: to_string与void指针一起工作,如operator <[closed]

问题描述 投票:2回答:3

我有一些代码,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_stringvoid*重叠更好(在std::stringstream中使用operator<<)?
c++ string c++11 void-pointers ostream
3个回答
3
投票
namespace my_to_str {
  using std::to_string;
  std::string to_string(void* ptr){
    // implement
  }
}

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


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


-1
投票

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

std::string operator+(const std::string &str, const void *vstr){
    return str + std::string(reinterpret_cast<const char *>(vstr));
}
© www.soinside.com 2019 - 2024. All rights reserved.