将指针转换为字符串"this"
Convert "this" pointer to string
在注册对象必须具有唯一名称的系统中,我希望在名称中使用/包含对象的this
指针。我想要创建???
的最简单方法,其中:
std::string name = ???(this);
您可以使用地址的字符串表示:
#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();
您的意思是将指针本身格式化为字符串?
std::ostringstream address;
address << (void const *)this;
std:string name = address.str();
或者。。。是的,在我打字的时间里,所有其他等效的答案!
#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;
}
您可以使用这个指针的地址,并将该ostrinstream的值作为字符串?
一个不需要整个字符串流的更简单的单行:
std::string address = std::to_string((unsigned long long)(void**)this);
同样隐含的是,它适用于任何时间的指针,而不仅仅是这个。如果你只需要它作为一个整数,也可以使用:
unsigned long long address = (unsigned long long)(void**)this;
您可以用系统提供的类型别名替换无符号long-long。在Windows上是uintptr_t
。
在注册对象必须具有唯一名称的系统中,我希望在名称中使用/包含对象的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") {}
};