Bagaimana cara mengambil tipe data suatu variabel?

9

Saya menggunakan Arduino dan saya ingin tahu apakah ada fungsi yang mengembalikan tipe data dari suatu variabel. Artinya, saya ingin menjalankan sesuatu seperti berikut ini:

// Note: 'typeof' is a sample function that should return the data type.
Serial.println(typeof(myVar));
pengguna502052
sumber
5
Mengapa Anda perlu melakukan ini? jenis variabel harus diketahui sejak Anda mendeklarasikannya
sachleen

Jawaban:

15

Dalam program C ++ biasa, Anda akan menggunakan typeidoperator, seperti ini:

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

Namun, itu memerlukan fitur kompiler yang disebut Informasi Jenis Runtime (RTTI). Ini dinonaktifkan di Arduino IDE, mungkin karena cenderung meningkatkan persyaratan memori runtime dari program.

Anda dapat memperoleh informasi lebih lanjut tentang biaya sumber daya di sini: /programming/579887/how-expensive-is-rtti

Kompilator C ++ dengan fitur lengkap pasti akan mendukung RTTI. Jika Anda ingin mencoba menggunakan IDE pihak ke-3 (seperti Eclipse dengan plugin Arduino) maka Anda dapat dengan mudah mengaktifkannya. Ini mungkin tidak sebanding dengan kerumitan hanya untuk itu saja.


Alternatif
Solusi yang berkinerja lebih tinggi (tetapi kurang fleksibel) akan menggunakan pendekatan kelas sifat. Ini melibatkan beberapa pemrograman meta templat yang funky:

// 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 )

Anda dapat menambahkan MAKE_TYPE_INFO(..)baris untuk jenis apa pun yang Anda inginkan, termasuk nama-nama kelas khusus. Anda kemudian dapat menggunakannya seperti ini:

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

Apa pun yang Anda tidak mendefinisikan menggunakan MAKE_TYPE_INFO(..)akan muncul sebagai "unknown".

Itu beberapa hal yang cukup canggih di sana, jadi saya tidak akan mencoba menjelaskan cara kerjanya di sini. Ada berbagai tutorial di web tentang pemrograman template C ++ jika Anda tertarik.

EDIT: Perlu dicatat bahwa typeofoperator tidak standar C ++, tetapi didukung oleh beberapa kompiler, seperti GCC. Ini pada dasarnya setara dengan decltype, yang muncul dalam standar C ++ 11.

Peter Bloomfield
sumber
jawaban yang sangat informatif dan menyeluruh! akan lebih menghargai jenis ini
Omer
11

Saya menggunakan pendekatan bodoh sederhana ...

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");} 

Ini adalah konsep polimorfisme di mana banyak fungsi dengan tipe parameter berbeda dibuat tetapi dengan nama fungsi yang sama . Selama waktu berjalan, fungsi yang cocok dengan jumlah argumen dan tipe argumen yang tepat akan dipanggil. Semoga penjelasan ini membantu.

SnakeNET
sumber
Bisakah Anda memperluas jawaban Anda sedikit , sebentar menjelaskan cara kerjanya?
Greenonline
saya harus menulis ulang dengan tangan karena copy paste menyebabkan masalah yang saya tidak mengerti. Setelah mengetik ulang dengan tangan seperti halnya pada sketsa itu bekerja seperti pesona. Cukup berguna ...
novski