1

変数に C++ のデータ型を尋ねることができるかどうか疑問に思っていましたか? 私はSchemeも知っています。そこでは、次のようなことをするだけです:

(define x 5)
(number? x)

そして、それは「true」を返します。C++でこのようなことは可能ですか?

4

6 に答える 6

7

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 */ }
}
于 2013-11-04T17:30:16.260 に答える
2

コンパイル時には、decltype. decltype(expression)式の型が得られます。

ランタイムに関する情報が必要な場合は、RTTI (Runtime Type Information) を や などで使用する必要がstd::type_infoありstd::type_indexます。

std::type_infoたとえば、実行時にクラス名を取得できます。

演算子type_infoを使用して取得します。typeid(それは を返しますstd::type_info const&)

于 2013-11-04T17:30:21.227 に答える
0

非常に限られた方法でのみ。変数の型がユーザー定義 (クラスまたは構造体) であり、クラス/構造体に少なくとも 1 つの仮想メソッドがある場合、typeid 演算子を使用して実行時の型情報を取得できます。クラス/構造体型でない場合、または仮想メソッドを持たない場合は、静的型 (つまり、変数の宣言された型) が提供されることに注意してください。

于 2013-11-04T17:31:02.917 に答える