C++のif
節の入力変数の型をチェックするにはどうすればよいですか? これを行うメンバー関数がある場合。条件文で変数の型を確認する方法
答えて
それはあなたが何をしたいタイプのチェックに依存します。
は、最も簡単なのは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を比較提唱者が、種類の比較を希望する理由を元の質問はを説明していないので、誤った一致が得られるかもしれないテストが不適切であると想定する根拠はありませんので。
hash_codeは、異なるタイプで異なることが保証されていません。言い換えれば、unordered_mapにフィードするのは良い値ですが、等価性を証明するのではありません(そのために 'typeinfo :: operator =()'を使用してください) –
私が言ったように、それは望ましい比較のタイプに依存します。 'hash_code()'の結果が等しくないと比較すると、型が異なります。それらが等しいかどうかを比較すると、型*が異なる可能性があるため、誤って一致する可能性はゼロになりません。偽陽性(または偽陰性)の可能性との潜在的な比較は、いくつかの適用において有効なスクリーニング技術である。 – Peter
まさに!私は、OPが 'hash_code()'の等価性が等しい型を証明していたかもしれないので、コメントしただけです。 –
あなたは、使用しようとすることができます。
typeid(yourvariable).name()
あなたはそれが動作するために、次のヘッダーを含める必要があります。
#include <typeinfo>
使いやすいソリューションは次のようになり次のもの:
#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
- 1. xslt1.0でxsl:ifの複数の条件を確認する方法
- 2. sqlserverのCASE文のTHEN句で条件を確認する方法
- 3. チェックボックスのクリックで条件を確認する方法は?
- 4. Typescriptのグローバルウィンドウオブジェクトの条件付きプロパティを確認する方法
- 5. SQLクエリの主キー条件を確認する方法は?
- 6. ASPXページの条件に確認ボックスをポップアップする方法は?
- 7. 条件を満たす回答を確認する方法
- 8. スクリプトが条件を確認する方法
- 9. 1つの変数の条件を確認することができます
- 10. 変数の型を確認する
- 11. C#条件式内のデータ型を変換する方法
- 12. ファイルの内容を条件文として確認するコマンド
- 13. Rails環境を確認するための条件文
- 14. 毎回条件を確認する
- 15. ループを確認する条件
- 16. 方法 - 複数の条件で変数を使用する
- 17. 小文字の文が偽であることを確認する条件
- 18. JavaScriptを使用したサブストリング条件の確認方法
- 19. reactjs内の複数の条件を確認する
- 20. ng-ifの複数の条件を確認する
- 21. Workflow 4.0の移行条件でnull変数を確認しています
- 22. 条件文で変数値が認識されない
- 23. 変数値が存在するかどうかを確認する条件
- 24. データベースを挿入する際の条件を確認する方法
- 25. 条件付き分割条件で変数から列名を渡す方法
- 26. if文の条件を確認してください
- 27. 投稿条件を確認するためのDrupalフォームの条件
- 28. javascriptのif文で2つの条件を同時に確認する
- 29. C++可変型条件式
- 30. SQL Server:条件ケースで変数を宣言する方法
の可能な複製を[どのように私は、変数の型を得るのですか?](http://stackoverflow.com/questions/ 11310898/how-do-i-get-the-a-of-a-variable) –
何をしたいのかを示すサンプルコードを提供してください。 – songyuanyao
これを行うには、設計上の問題があることを示します。 –