私はArduinoを使用していますが、変数のデータ型を返す関数があるかどうか知りたいのですが。つまり、次のようなものを実行したいと思います。
// Note: 'typeof' is a sample function that should return the data type.
Serial.println(typeof(myVar));
私はArduinoを使用していますが、変数のデータ型を返す関数があるかどうか知りたいのですが。つまり、次のようなものを実行したいと思います。
// Note: 'typeof' is a sample function that should return the data type.
Serial.println(typeof(myVar));
回答:
典型的な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標準に含まれていると同等の古いバージョンです。
私は単純な愚かなアプローチを使用しています...
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");}
これはという概念である多型の複数の機能別のパラメータの型とは、しかしで作成された同じ関数名。実行時に、適切な数の引数と引数の型に一致する関数が呼び出されます。この説明がお役に立てば幸いです。