2016-05-24 9 views
1

C++のif節の入力変数の型をチェックするにはどうすればよいですか? これを行うメンバー関数がある場合。条件文で変数の型を確認する方法

+1

の可能な複製を[どのように私は、変数の型を得るのですか?](http://stackoverflow.com/questions/ 11310898/how-do-i-get-the-a-of-a-variable) –

+2

何をしたいのかを示すサンプルコードを提供してください。 – songyuanyao

+1

これを行うには、設計上の問題があることを示します。 –

答えて

2

それはあなたが何をしたいタイプのチェックに依存します。

は、最も簡単なのはstd::stringへの変換は仕事に比較演算子のために必要とされる

if (std::string(typeid(input_variable).name()) == typeid(chosen_type).name()) 
{ 
     // input_variable is of type chosen_type 
} 

タイプを識別(実装が定義された)名前の文字列をチェックすることも可能であるおそらく

#include <typeinfo>  // for the `std::type_info` type 

if (typeid(input_variable) == typeid(chosen_type)) 
{ 
     // input_variable is of type chosen_type 
} 

です.name()メンバー関数はconst char *を返します。それ以外の場合は、strcmp()(Cの<string.h>またはC++ <cstring>のいずれか - 名前空間std)のメンバーをname()のメンバーと比較してください。

typeid(X).nameによって返される文字シーケンスは実装定義であることに注意してください。

C++ 11では、type_infoタイプはhash_code()のメンバを持っています。これも比較することができます。この値は実装定義であり、プログラムの実行によって異なる場合があります。さらに、マーティン・ボナーがコメントで述べたように、hash_code()は平等のために偽陽性を与えるかもしれません(もしhash_code()が非等価であるならば、型は異なりますが同じ型を比較す​​ればと異なるかもしれません。 hash_code() Sを比較提唱者が、種類の比較を希望する理由を元の質問はを説明していないので、誤った一致が得られるかもしれないテストが不適切であると想定する根拠はありませんので。

+2

hash_codeは、異なるタイプで異なることが保証されていません。言い換えれば、unordered_mapにフィードするのは良い値ですが、等価性を証明するのではありません(そのために 'typeinfo :: operator =()'を使用してください) –

+0

私が言ったように、それは望ましい比較のタイプに依存します。 'hash_code()'の結果が等しくないと比較すると、型が異なります。それらが等しいかどうかを比較すると、型*が異なる可能性があるため、誤って一致する可能性はゼロになりません。偽陽性(または偽陰性)の可能性との潜在的な比較は、いくつかの適用において有効なスクリーニング技術である。 – Peter

+0

まさに!私は、OPが 'hash_code()'の等価性が等しい型を証明していたかもしれないので、コメントしただけです。 –

1

あなたは、使用しようとすることができます。

typeid(yourvariable).name() 

あなたはそれが動作するために、次のヘッダーを含める必要があります。

#include <typeinfo> 
0

使いやすいソリューションは次のようになり次のもの:

#include<cassert> 

struct B { static int cnt; }; 
int B::cnt = 0; 

template<class T> 
struct S: B { static int type; }; 

template<typename T> 
int S<T>::type = B::cnt++; 

template<typename T, typename U> 
bool f(T, U) { 
    return S<T>::type == S<U>::type; 
} 

int main() { 
    assert(f(42, 0)); 
    assert(!f(0, .0)); 
} 

S<T>::typeは、ガードステートメントまたは任意の場所で使用できます。
あなたがxという名前の変数を持っている場合は、のようなもの使用しての問題です:

S<decltype(x)>::type 
関連する問題