3

持っている-

C_Type.h

#ifndef C_TYPE_H
#define C_TYPE_H
template <class T>
class C_Type {
    public:
        T m_val;
            // implementation ... 

};

#endif

そしてプログラム-

#include <iostream>
#include <typeinfo>
#include "C_Type.h"
using namespace std ; 


int main () {
    C_Type<int> a  ; 
    cout <<typeid(a.m_val).name()<<endl;

}

intで構成されるものを抽出しようとするとC_Type<int>、上記のプログラムは出力を返しました- i

編集 :

クラスメンバー(すなわち)に関係なくタイプ(すなわちintまたはi)を取得することは可能m_valですか?

4

4 に答える 4

5

typeid :: nameによって返される名前はコンパイラ固有であり、一部のコンパイラにとっては恐ろしいものです(のようiint)。ほとんどのコンパイラは、より良い表現につながる名前のデアンアングルをサポートしていますが、それでもプログラムでの使用には役に立ちません。

一般的なコンパイラのデマングリングAPIのリストは次のとおりです。

于 2012-12-06T10:21:36.817 に答える
3

最後の質問(メンバーを参照せずにタイプを取得することに関して)への回答:いいえ。typedef標準ライブラリには、インスタンス化タイプとそれから派生したタイプを提供するための規則があります。通常の名前はですがvalue_type、例外があります(例std::map)。この規則を順守したい場合(これは悪い考えではありません)、次を追加する必要があります。

typedef T value_type;

クラスに(パブリックメンバーとして)、任意のメンバー(存在する場合と存在しない場合があります)ではなく、タイプが必要なときに参照します。

于 2012-12-06T10:52:05.303 に答える
1

「i」は正しい名前で、「int」タイプの場合がありますか?それはただの名前です!その名前で何をしたいですか?

 int main () {
    C_Type<int> a  ; 
    int test=0;
    if(typeid(a.m_val) == typeid(test))
      cout <<"Int"<<endl;
 }
于 2012-12-06T10:39:00.807 に答える
0

テンプレート仕様からテンプレートパラメータを取得する必要がある場合(そしてC ++ 11を使用している場合)、次のことができます。

template <template <typename> class Templ, typename T>
T typeGetter(Templ<T>);

次に、メインで:

int main () {
    C_Type<int> a;
    decltype(typeGetter(a)) i = 7; //declares i to be int
}
于 2012-12-06T11:07:03.587 に答える