将“this”指针转换为字符串

问题描述 投票:0回答:7

在注册对象必须具有唯一名称的系统中,我想在名称中使用/包含对象的

this
指针。我想要最简单的方法来创建
???
其中:

std::string name = ???(this);

c++ pointers stl
7个回答
51
投票

您可以使用地址的字符串表示形式:

#include <sstream> //for std::stringstream 
#include <string>  //for std::string

const void * address = static_cast<const void*>(this);
std::stringstream ss;
ss << address;  
std::string name = ss.str(); 

10
投票

你的意思是把指针本身格式化为字符串?

std::ostringstream address;
address << (void const *)this;
std:string name = address.str();

或者...是的,在我输入此内容时所有其他等效答案!


4
投票
#include <sstream>
#include <iostream>
struct T
{
    T()
    {
        std::ostringstream oss;
        oss << (void*)this;
        std::string s(oss.str());

        std::cout << s << std::endl;
    }
};

int main()
{
    T t;
} 

4
投票

一种更简单的单行代码,不需要整个字符串流:

std::string address = std::to_string((unsigned long long)(void**)this);

也暗示,适用于任何时间的指针,而不仅仅是这个。如果您只需要它作为整数也可以:

unsigned long long address = (unsigned long long)(void**)this;

您可以将 unsigned long long 替换为系统提供的类型别名。在 Windows 上是

uintptr_t


2
投票

您可以使用 ostringstream 作为 this 指针的地址并将该 ostringstream 的值作为字符串吗?


0
投票

在注册对象必须具有唯一名称的系统中,我想在名称中使用/包含对象的 this 指针。

对象的地址不一定是唯一的。示例:您动态分配这样一个对象,使用它一段时间,删除它,然后分配另一个这样的对象。新分配的对象很可能具有与先前分配的对象地址相同的对象地址。

有更好的方法来为某些东西生成唯一的名称。 gensym 计数器,例如:

// Base class for objects with a unique, autogenerated name.
class Named {
public:
  Named() : unique_id(gensym()) {}
  Named(const std::string & prefix) : unique_id(gensym(prefix)) {}

  const std::string & get_unique_id () { return unique_id; }

private:
  static std::string gensym (const std::string & prefix = "gensym");
  const std::string unique_id;
};  

inline std::string Named::gensym (const std::string & prefix) {
  static std::map<std::string, int> counter_map;
  int & entry = counter_map[prefix];
  std::stringstream sstream;
  sstream << prefix << std::setfill('0') << std::setw(7) << ++entry;
  return sstream.str();
}   

// Derived classes can have their own prefix. For example,
class DerivedNamed : public Named {
public:
  DerivedNamed() : Named("Derived") {}
};  

0
投票

将指针转换为字符串的简单而显式的方法:

std::string str = std::to_string(reinterpret_cast<uintptr_t>(ptr));
© www.soinside.com 2019 - 2024. All rights reserved.