2017-12-02 19 views
-1

実行時にC++クラスインスタンスの識別子をプログラムで取得します。 C++はまだリフレクションをサポートしていないことを認識していますが、そこには別の解決策がありますか? 「my_obj」をプリントアウトする必要があり、このプログラムを実行する"this"ポインタを使用してオブジェクト名を取得することができます

class Foo { 
    Foo() { 
    auto name = reflect::getIdentifierName(this); 
    std::cout << name << std::endl; 
    } 
}; 

void main() { 
    Foo my_obj; 
} 

:たとえば は、以下の例を与えます。 私は、この基本リフレクション機能を実装するために使用できるユーティリティライブラリを探しています。

libclangがこのような情報を抽出するために使用できるかどうか、もしそうなら、これを行うためのリフレクション関数をどのように構築するかについてのヒントがあります。

+0

これはオブジェクトの識別子であるクラス名ではありません。名前をコンストラクタに文字列として与えて保存し、ゲッタから返すことを検討しましたか? – Yunnosch

+1

オブジェクトには名前はなく、変数には名前がありません。オブジェクトと変数の間には、一般に1対1の関係はありません。 –

+0

私はプログラムでクラスオブジェクトのインスタンスの名前を取得するのに役立つツールを探しています(クラスの名前ではありません)。例えばパーサーツール。 –

答えて

1

はい、これは実装定義です。自己責任で行ってください。

Yunnoschの提案は、より多くの文脈なしにはるかに合理的に聞こえる。

#include <iostream> 
#include <typeinfo> 

class Foo { 
public: 
    Foo() { 
    const char * const name = typeid(this).name(); 
    std::cout << name << std::endl; 
    } 
}; 

int main() 
{ 
    Foo my_obj; 
} 
+0

ありがとうございました。このソリューションは、 "my_obj"ではない "Foo"を出力します。クラス名ではなく、クラスインスタンス変数を出力する方法を探しています。 –

+0

あなたが話すこの「クラスインスタンス変数」とは何ですか?私は自動的に提供された変数は認識していませんが、静的変数を使用するか、このポインタを使って各オブジェクトの一意のアドレスを取得することで独自の変数を作成できます。 – tweej

関連する問題