typeof(別名typeOf、 TypeOf )は、変数のデータ型を判定するために、いくつかのプログラミング言語で提供されている演算子です。これは、型を明示的に指定せずに複数の型のデータを受け入れる必要があるプログラムを作成する際に便利です。
多態性と型キャストをサポートする言語では、typeof 演算子はオブジェクトに適用された場合、2 つの異なる意味のいずれかを持つことがあります。Visual Basicなどの一部の言語では、[ 1 ] typeof 演算子はオブジェクトの動的型を返します。つまり、型キャストに関係なく、オブジェクトの真の元の型を返します。これらの言語では、typeof 演算子は実行時型情報を取得するためのメソッドです。
C# [ 2 ]やD [ 3 ]などの他の言語、および C ( C23以降) [ 4 ] [ 5 ]では、 typeof 演算子はオペランドの静的型を返します。つまり、元の形式に関係なく、プログラム内でその時点で宣言された型に評価されます。これらの言語には通常、 typeidなどの実行時型情報を取得するための他の構造があります。
このような演算子は、値として使用して型の実行時表現を提供することも、値に適用できる型自体として使用することもできます。
C23 以降、typeofはC標準の一部となっています。演算子typeof_unqualも追加されましたが、これはと同じですtypeofが、cvr修飾とアトミック修飾を削除します(decltypeC++のとは区別されます)。[ 6 ] [ 7 ]
typeofマクロ内の未知の型の変数にバインドする場合に役立ちます。この例では、max入力が複数回評価されるのを避けるために一時変数を使用する必要があり、typeofこれらの一時変数の型を指定するために を使用します。この例では、C 言語の非標準拡張機能、つまり式としての複合ステートメントの使用 (GNU GCC [ 8 ]などでサポートされています)を使用していることに注意してください。
#define max(a, b) ({ \ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; \ })C++ は、decltypeおよびtypeid演算子を提供します。[ 9 ] [ 10 ]decltypeは、C の と同様にtypeof、型を省略したり、型が不明な汎用変数の型に依存する変数に型を与えたりするために使用されます (たとえば、テンプレートやマクロ内)。 は、typeid動的ディスパッチのために、実行時の型の表現を提供します。
struct Double { double value ; }const Double * d ;// decltype は型宣言で使用できますdecltype ( d -> value ) y ; // double y と同等です。// decltype は末尾の戻り値の型で使用できます// これは、たとえば型 T + 型 U が T と U とは異なる型 V になる可能性があるオーバーロードされた演算子で必要になる場合がありますtemplate < typename T , typename U > auto add ( T t , U u ) -> decltype ( t + u ) { return t + u ; }C++26で導入された^^リフレクション演算子は、型の表現を値として取得するためにも使用できます。[ 11 ]
import std ;using std :: string ; using std :: meta :: info ;struct User { string name ; int age ; };int main () { constexpr info stringClass = ^^ string ;constexpr User john { . name = "John Doe" , . age = 20 }; std :: println ( "The class of {} is {}" , john . name , std :: meta :: identifier_of ( ^^ User )); }C#では、このSystem.Object.GetType()メソッドはSystem.Type値の実行時型を表す値を返します。[ 12 ]代わりに、このtypeof演算子は型の実行時表現を提供し、値の型を決定しません。[ 13 ]
// オブジェクトが与えられた場合、それが整数かどうかを返します。// 「is」演算子を使用してこれを判断することもできます。public static bool IsInteger ( object o ) { return o . GetType () == typeof ( int ); }java.lang.ObjectのgetClass()メソッドは、常にクラスのインスタンスである任意のオブジェクトのクラスを返すために使用できますjava.lang.Class。[ 14 ]すべての型は、「 」を追加することで実行時表現値に変換できます。名前とは裏腹に、プリミティブ( )や配列( ).classなど、クラスでない場合でも可能です。int.classString[].class
String s = " Hello, world!" ; Class <?> sClass = s.getClass ( );Class < String > stringClass = String . class ; Class < Integer > intClass = int . class ;Object obj = /* ここに何か */ ; System . out . printf ( "オブジェクト %s のクラスは %s%n です" , obj , obj . getClass (). getName ()); JavaScript の演算子typeofは、値の基本実行時型を表す文字列を返します。[ 15 ]
function isNumber ( n ) { return typeof n === 'number' ; }TypeScriptはJavaScriptのtypeof演算子を拡張し、別の値の型の中で使用できるようにすることで、値の静的な型を表します。
function someFunction ( param : typeof existingObject ) : void { // ... }let newObject : typeof existingObject ;Pythonには組み込み関数がありますtype。[ 16 ]
print ( type ( 123 )) # 出力: <class 'int'>VB.NETでは、C# の「typeof」に相当するものを VB.NET のGetTypeメソッドに変換する必要があります。VB.NETのTypeOfキーワードは、オブジェクト参照変数とデータ型を比較するために使用されます。
次の例では、TypeOf...Is式を使用して、2 つのオブジェクト参照変数とさまざまなデータ型との型互換性をテストします。
Dim refInteger As Object = 2MsgBox ( "オブジェクト[Integer]の型は整数ですか? " & TypeOf refIntegerは整数です) MsgBox ( "オブジェクト[Integer]の型は倍精度浮動小数点数ですか? " & TypeOf refIntegerは倍精度浮動小数点数です)Dim refForm As Object = New System.Windows.Forms.FormMsgBox ( "TypeOf Object[Form] Is Form? " & TypeOf refForm Is System . Windows . Forms . Form ) MsgBox ( "TypeOf Object[Form] Is Label? " & TypeOf refForm Is System . Windows . Forms . Label ) MsgBox ( "TypeOf Object[Form] Is Control? " & TypeOf refForm Is System . Windows . Forms . Control ) MsgBox ( "TypeOf Object[Form] Is IComponent? " & TypeOf refForm Is System . ComponentModel . IComponent ){{cite web}}: CS1 maint: url-status (リンク){{cite web}}: CS1 maint: url-status (リンク)