В системе, где зарегистрированные объекты должны иметь уникальные имена, я хочу использовать/включать указатель объекта this
в имя. Мне нужен самый простой способ создать ???
где:
std::string name = ???(this);
В системе, где зарегистрированные объекты должны иметь уникальные имена, я хочу использовать/включать указатель объекта 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;
}
Вы можете использовать ostringstream этот адрес указателя и поместить это значение ostringstream в качестве строки?
В системе, где зарегистрированные объекты должны иметь уникальные имена, я хочу использовать/включать объект в этот указатель.
Адрес объекта не обязательно уникален. Пример. Вы динамически выделяете такой объект, используете его некоторое время, удаляете его и затем выделяете другой такой объект. Этот недавно выделенный объект может иметь тот же самый адрес объекта, что и предыдущий.
Есть намного лучшие способы создания уникального имени для чего-то. Гентный счетчик, например:
// 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") {}
};