web-dev-qa-db-ja.com

「this」ポインタを文字列に変換する

登録されたオブジェクトに一意の名前が必要なシステムでは、オブジェクトのthisポインターを使用/名前に含めたいと思います。 _???_を作成する最も簡単な方法が必要です。ここで:

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

15
Mr. Boy

アドレスの文字列表現を使用できます。

#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(); 
34
Nawaz

ポインタ自体を文字列としてフォーマットするという意味ですか?

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

または...はい、これを入力するのにかかった時間内の他のすべての同等の答え!

7
Useless
#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
mloskot

このポインタのアドレスをostringstreamを使用して、そのostringstreamの値を文字列として配置できますか?

2

登録されたオブジェクトに一意の名前を付ける必要があるシステムでは、オブジェクトの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
David Hammen