[解決済み] C++における'typeid'と'typeof'の比較
質問
とはどう違うのでしょうか?
typeid
と
typeof
をC++で作成しました。以下は私が知っていることです。
-
typeid
のドキュメントに記載されています。 タイプ_info これは、C++のヘッダーファイルで定義されている タイプインフォ . -
typeof
は、C言語のGCC拡張とC++で定義されています。 ブースト ライブラリで使用されます。
また、私が作成したテストコード・テストで
typeid
は、私が期待したものを返しません。なぜでしょうか?
main.cpp
#include <iostream>
#include <typeinfo> //for 'typeid' to work
class Person {
public:
// ... Person members ...
virtual ~Person() {}
};
class Employee : public Person {
// ... Employee members ...
};
int main () {
Person person;
Employee employee;
Person *ptr = &employee;
int t = 3;
std::cout << typeid(t).name() << std::endl;
std::cout << typeid(person).name() << std::endl; // Person (statically known at compile-time)
std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time)
std::cout << typeid(ptr).name() << std::endl; // Person * (statically known at compile-time)
std::cout << typeid(*ptr).name() << std::endl; // Employee (looked up dynamically at run-time
// because it is the dereference of a pointer
// to a polymorphic class)
}
を出力します。
bash-3.2$ g++ -Wall main.cpp -o main
bash-3.2$ ./main
i
6Person
8Employee
P6Person
8Employee
解決方法は?
C++言語には
typeof
. あなたは、何かコンパイラ特有の拡張機能を見ているに違いありません。もし、あなたが話しているのがGCCの
typeof
というキーワードで、C++11にも同様の機能があります。
decltype
. ここでも、C++にはこのような
typeof
キーワードを使用します。
typeid
はC++言語の演算子で、実行時に型の識別情報を返す。基本的には
type_info
オブジェクトと等価比較可能であり、他の
type_info
オブジェクトを作成します。
なお、返された
type_info
オブジェクトが持っているのは、等比級数と非等比級数であること、つまり
type_info
異なる型を記述するオブジェクトは非等価で比較され、一方
type_info
オブジェクトは等しく比較されなければならない。それ以外はすべて実装で定義されます。様々な名前を返すメソッドは、人間が読めるようなものを返すことは保証されていませんし、全く何も返さないという保証もありません。
また、上記はおそらく(規格では明確に言及されていないようですが)、連続した
typeid
は、同じ型に対して異なる
type_info
オブジェクトを作成します(もちろん、これらは等しく比較されなければなりません)。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] テスト
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] 型チェック:typeof、GetType、is?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] C++でオブジェクトの型を検索する