変数に C++ のデータ型を尋ねることができるかどうか疑問に思っていましたか? 私はSchemeも知っています。そこでは、次のようなことをするだけです:
(define x 5)
(number? x)
そして、それは「true」を返します。C++でこのようなことは可能ですか?
変数に C++ のデータ型を尋ねることができるかどうか疑問に思っていましたか? 私はSchemeも知っています。そこでは、次のようなことをするだけです:
(define x 5)
(number? x)
そして、それは「true」を返します。C++でこのようなことは可能ですか?
C++ に相当するものは、おそらく次のようになります。
auto x = 5;
using x_type = decltype(x);
そして、あなたはそれをチェックすることができます
if( std::is_same<x_type,int>::value ) ...
しかし、C++ は静的に型付けされているため、これがあなたが念頭に置いていることかどうかはわかりません。クラス階層がある場合は、動的型付けもあります。
struct Base { virtual ~Base() {} };
struct Derived1 : Base {};
struct Derived2 : Base {};
int main()
{
Base* p = new Derived2;
if( dynamic_cast<Derived1*>(p) ) { /* is Derived1 */ }
else if( dynamic_cast<Derived2*>(p) ) { /* is Derived2 */ }
else { /* neither */ }
}
コンパイル時には、decltype
. decltype(expression)
式の型が得られます。
ランタイムに関する情報が必要な場合は、RTTI (Runtime Type Information) を や などで使用する必要がstd::type_info
ありstd::type_index
ます。
std::type_info
たとえば、実行時にクラス名を取得できます。
演算子type_info
を使用して取得します。typeid
(それは を返しますstd::type_info const&
)
非常に限られた方法でのみ。変数の型がユーザー定義 (クラスまたは構造体) であり、クラス/構造体に少なくとも 1 つの仮想メソッドがある場合、typeid 演算子を使用して実行時の型情報を取得できます。クラス/構造体型でない場合、または仮想メソッドを持たない場合は、静的型 (つまり、変数の宣言された型) が提供されることに注意してください。