Преобразовать указатель this в строку - PullRequest
13 голосов
/ 21 октября 2011

В системе, где зарегистрированные объекты должны иметь уникальные имена, я хочу использовать / включать указатель this объекта в имени.Я хочу самый простой способ создать ??? где:

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

Ответы [ 5 ]

33 голосов
/ 21 октября 2011

Вы можете использовать строковое представление адреса:

#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(); 
7 голосов
/ 21 октября 2011

Вы хотите отформатировать сам указатель как строку?

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

Или ... да, все другие эквивалентные ответы за то время, которое у меня ушло, чтобы напечатать это!

4 голосов
/ 21 октября 2011
#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;
} 
2 голосов
/ 21 октября 2011

Вы можете использовать ostringstream для адреса этого указателя и поместить значение этого ostringstream в качестве строки?

0 голосов
/ 21 октября 2011

В системе, где зарегистрированные объекты должны иметь уникальные имена, я хочу использовать / включать указатель this в имени объекта.

Адрес объекта не обязательно является уникальным.Пример. Вы динамически выделяете такой объект, некоторое время используете его, удаляете, а затем выделяете другой такой объект.Этот вновь выделенный объект вполне может иметь тот же адрес объекта, что и предыдущий.

Существуют гораздо лучшие способы для генерации уникального имени для чего-либо.Счетчик Генсим, например:

// 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") {}
};  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...