c++ 使std::to_string与void指针一起工作,如operator〈〈?[closed]

z0qdvdin  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(110)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

六年前关闭了。
Improve this question
我有一些代码,其中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()中使用流之外,还有什么比为void*重载std::to_string(为operator<<在那里使用std::stringstream)更好的方法吗?
6gpjuf90

6gpjuf901#

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

现在my_to_str::to_string可以用您自己的重载集来扩展,比如void*

fhg3lkii

fhg3lkii2#

你不能为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 oss.str();
    }

    template <class T>
    std::string to_string(T const& val) {
        return to_string(val, 0);
    }
}

这 * 确实 * 允许用任何你想要的细节重载N::to_string()(例如,如果你想让N::to_string(void* )做一些特殊的事情,只需添加另一个重载)。

zfciruhq

zfciruhq3#

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

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

相关问题