変数のデータ型を取得するにはどうすればよいですか?


9

私はArduinoを使用していますが、変数のデータ型を返す関数があるかどうか知りたいのですが。つまり、次のようなものを実行したいと思います。

// Note: 'typeof' is a sample function that should return the data type.
Serial.println(typeof(myVar));

5
なぜこれを行う必要があるのですか?宣言したので、変数の型はわかっている必要があります
sachleen

回答:


15

典型的なC ++プログラムでは、次のtypeidように演算子を使用します。

std::cout << typeid(myVar).name();

ただし、これにはランタイムタイプ情報(RTTI)と呼ばれるコンパイラ機能が必要です。Arduino IDEでは無効になっています。これは、おそらくプログラムのランタイムメモリ要件が増加する傾向があるためです。

リソースコストの詳細については、https//stackoverflow.com/questions/579887/how-expensive-is-rttiをご覧ください。

ただし、すべての機能を備えたC ++コンパイラは確実にRTTIをサポートします。サードパーティのIDE(Arduinoプラグインを備えたEclipseなど)を使用したい場合は、簡単に有効にすることができます。それだけでも、面倒なことに価値はないでしょう。



の方法パフォーマンスが高い(ただし柔軟性が低い)ソリューションは、特性クラスアプローチを使用することです。これには、いくつかのファンキーなテンプレートメタプログラミングが含まれます。

// Generic catch-all implementation.
template <typename T_ty> struct TypeInfo { static const char * name; };
template <typename T_ty> const char * TypeInfo<T_ty>::name = "unknown";

// Handy macro to make querying stuff easier.
#define TYPE_NAME(var) TypeInfo< typeof(var) >::name

// Handy macro to make defining stuff easier.
#define MAKE_TYPE_INFO(type)  template <> const char * TypeInfo<type>::name = #type;

// Type-specific implementations.
MAKE_TYPE_INFO( int )
MAKE_TYPE_INFO( float )
MAKE_TYPE_INFO( short )

MAKE_TYPE_INFO(..)カスタムクラスの名前を含む、任意のタイプの行を追加できます。その後、次のように使用できます。

int myVar = 17;
Serial.println( TYPE_NAME(myVar) );

を使用して定義しないものはすべてMAKE_TYPE_INFO(..)として表示され"unknown"ます。

これはかなり高度な機能なので、ここではすべてがどのように機能するかについては説明しません。Webにはさまざまなチュートリアルがありますが、興味がある場合はC ++テンプレートプログラミングについて説明しています。

編集:typeof演算子は標準のC ++ではありませんが、GCCなどのいくつかのコンパイラでサポートされていることに注意してください。これは基本的decltypeに、C ++ 11標準に含まれていると同等の古いバージョンです。


非常に有益で完全な答え!この種の方がもっとありがたいです
オメル2014年

11

私は単純な愚かなアプローチを使用しています...

void types(String a){Serial.println("it's a String");}
void types(int a)   {Serial.println("it's an int");}
void types(char* a) {Serial.println("it's a char*");}
void types(float a) {Serial.println("it's a float");} 

これはという概念である多型の複数の機能別のパラメータの型とは、しかしで作成された同じ関数名。実行時に、適切な数の引数と引数の型に一致する関数が呼び出されます。この説明がお役に立てば幸いです。


それがどのように機能するかを簡単に説明して、あなたの答えを少し広げていただけませんか?
Greenonline 2017年

コピーペーストにより理解できない問題が発生したため、手動で書き直さなければなりませんでした。スケッチと同じように手作業で再入力した後、魅力のように機能しました。かなり
便利
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.