2013-12-19 12 views
6

Qtが変数型を認識し、人間が判読可能な形式でその名前を取得するために、typeidに代わるものを提供しているのだろうかと思います。 私の具体的な問題は以下の通りです:Qt:typeid alternative

struct gArgument{ 
    QString type; 
    void* arg; 
}; 

void gargConverter(gArgument* oArg, T data){ 
    oArg->type = typeid(data).name(); 
    oArg->arg = static_cast<void*> (&data); 
} 

アイデアは関数への入力として使用する変数を一般のものとなります。 は、私がしようとした場合、(私は、Windows 7上でのMinGWを使用しています)私のシステム上で正しく動作していないようだtyeinfo側ノードとして:

int i; std::cout << typeid(i).name() << std::endl; 
    QString s; std::cout << typeid(s).name() << std::endl; 
    double d; std::cout << typeid(d).name() << std::endl; 
    float f; std::cout << typeid(f).name() << std::endl; 

私は

i 
7QString 
d 
f 

どれでも提案を取得しますか?

+2

私はあなたのプログラムの出力が期待される出力だと思います。変数 'i'、' d'、 'f'の名前を変更しても、それらの文字列は私に与えられます。 'typeid :: name()'の出力の正確なスペルは実装定義されており、その型のC++マングル化された名前に関連する名前を与えているようです。それは実際にはある程度の意味を持っています。 –

+1

Typeinfoは、ご使用のシステムで正しく動作しています。なぜあなたは問題があると思いますか? –

+0

これにはQtは必要ありません。ほとんどのC++実装は、ある程度のコンパイラ固有ですが、必要なものを提供します。 –

答えて

4

あなたはthisを使用することができます。

const char * QVariant::typeName() const

はバリアントに保存されているタイプの名前を返します。返される文字列には、データの格納に使用されるC++データ型が記述されます(例: "QFont"、 "QString"、 "QVariantList")。無効なバリアントは0を返します。

これは、PODおよび組み込みのQtタイプで動作します。あなたのカスタムタイプを登録するのにfollowing methodを使用する必要があります。

int qRegisterMetaType(const char * typeName)

一つ、それはQVariantに多少余計ですが、あなたは、試みることができる他の事は次のようにオブジェクトのQMetaObjectで動作するようです:

const char * QMetaObject::className() const

は、クラス名を返します。

const QMetaObject * QObject::metaObject() const [virtual]

このオブジェクトのメタオブジェクトへのポインタを返します。

メタオブジェクトには、QObjectを継承するクラスに関する情報が含まれています。クラス名、スーパークラス名、プロパティ、シグナル、およびスロットが含まれます。 Q_OBJECTマクロを含むすべてのQObjectサブクラスには、メタオブジェクトがあります。

メタオブジェクト情報は、信号/スロット接続メカニズムとプロパティシステムによって必要とされます。 inherits()関数もメタオブジェクトを使用します。

実際のオブジェクト・インスタンスへのポインターがなくても、クラスのメタオブジェクトにアクセスしたい場合は、staticMetaObjectを使用できます。

言うまでもなく、これはQObjectのみで動作するため、QStringなどは動作しません。QObjectサブクラスを作成する必要があります。

はまた、あなたが作成するために使用できるいくつかのQMetaTypeがありますが、thisは少し異なっているので、私はちょうど完全であることをここで言及しています:

int QMetaType::type(const char * typeName) [static]

はタイプのハンドルを返します。このような型がない場合は、typeNameまたはQMetaType :: UnknownTypeと呼ばれます。ここで

あなたはすべてのタイプを見つけることができます:

http://qt-project.org/doc/qt-5.1/qtcore/qmetatype.html#Type-enum

0

あなたは普遍的な変数、QVariantのようなものを取得しようとしているように見えます。 QVariantは、すべての基本タイプとすべてのQtタイプに対して完全に機能します。他のタイプはQtメタデータシステムにregisteredとすることができます。

1

タイプ名が変更されています。動作が定義されているので、これは完璧です。人間が読めるようにするには、名前を変更するコンパイラ(gccとllvm)の名前を修正する必要があります。

以下はg ++、llvm-C++、およびMS Visual C++の下で動作しますので、合理的に期待できるほどポータブルです。 gccとLLVMから

#include <iostream> 
#ifndef _MSC_VER 
#include <cxxabi.h> 
#endif 

struct QEvent { virtual ~QEvent() {} }; 

struct MyEvent : public QEvent {}; 

#ifndef _MSC_VER 
template <typename T> void dumpType(T val) 
{ 
    int status; 
    char * realname = abi::__cxa_demangle(typeid(val).name(), 0, 0, &status); 
    std::cout << realname << std::endl; 
    free(realname); //important! 
} 

template <typename T> void dumpType(T *ptr) 
{ 
    int status; 
    char * realname = abi::__cxa_demangle(typeid(*ptr).name(), 0, 0, &status); 
    std::cout << realname << std::endl; 
    free(realname); //important! 
} 
#else 
template <typename T> void dumpType(T val) 
{ 
    std::cout << typeid(val).name() << std::endl; 
} 
template <typename T> void dumpType(T *ptr) 
{ 
    std::cout << typeid(*ptr).name() << std::endl; 
} 
#endif 

int main() { 
    QEvent * base = new QEvent; 
    QEvent * der = new MyEvent; 
    dumpType(int()); 
    dumpType(base); 
    dumpType(der); 
} 

出力:MSVCから

int 
QEvent 
MyEvent 

出力:

int 
class QEvent 
class MyEvent