Tôi đang sử dụng Arduino và tôi muốn biết liệu có một hàm trả về kiểu dữ liệu của một biến không. Đó là, tôi muốn chạy một cái gì đó như sau:
// Note: 'typeof' is a sample function that should return the data type.
Serial.println(typeof(myVar));
Tôi đang sử dụng Arduino và tôi muốn biết liệu có một hàm trả về kiểu dữ liệu của một biến không. Đó là, tôi muốn chạy một cái gì đó như sau:
// Note: 'typeof' is a sample function that should return the data type.
Serial.println(typeof(myVar));
Câu trả lời:
Trong một chương trình C ++ điển hình, bạn sẽ sử dụng typeid
toán tử, như thế này:
std::cout << typeid(myVar).name();
Tuy nhiên, điều đó đòi hỏi một tính năng biên dịch gọi là Thông tin loại thời gian chạy (RTTI). Nó bị vô hiệu hóa trong Arduino IDE, có lẽ vì nó có xu hướng tăng các yêu cầu bộ nhớ thời gian chạy của chương trình.
Bạn có thể nhận thêm thông tin về chi phí tài nguyên tại đây: /programming/579887/how-Exensive-is-rtti
Bất kỳ trình biên dịch C ++ đầy đủ tính năng chắc chắn sẽ hỗ trợ RTTI. Nếu bạn muốn thử sử dụng IDE của bên thứ 3 (chẳng hạn như Eclipse với plugin Arduino) thì bạn có thể dễ dàng kích hoạt nó. Có lẽ nó không đáng để phiền phức cho việc đó.
Giải pháp thay thế Hiệu
suất cao hơn (nhưng kém linh hoạt hơn) sẽ là sử dụng cách tiếp cận lớp đặc điểm. Điều này liên quan đến một số lập trình meta mẫu thú vị:
// 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 )
Bạn có thể thêm MAKE_TYPE_INFO(..)
dòng cho bất kỳ loại nào bạn muốn, bao gồm tên của các lớp tùy chỉnh. Sau đó bạn có thể sử dụng nó như thế này:
int myVar = 17;
Serial.println( TYPE_NAME(myVar) );
Bất cứ điều gì bạn không xác định sử dụng MAKE_TYPE_INFO(..)
sẽ hiển thị như "unknown"
.
Đó là một số thứ khá tiên tiến trong đó, vì vậy tôi sẽ không cố gắng giải thích tất cả mọi thứ hoạt động ở đây như thế nào. Có nhiều hướng dẫn khác nhau trên web về lập trình mẫu C ++ nếu bạn quan tâm.
EDIT: Đáng lưu ý rằng typeof
toán tử không phải là C ++ tiêu chuẩn, nhưng được hỗ trợ bởi một vài trình biên dịch, chẳng hạn như GCC. Về cơ bản, nó tương đương cũ hơn decltype
, xuất hiện trong tiêu chuẩn C ++ 11.
Tôi sử dụng một cách tiếp cận ngu ngốc đơn giản ...
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");}
Đây là khái niệm về đa hình trong đó nhiều hàm với các loại tham số khác nhau được tạo ra nhưng có cùng tên hàm . Trong thời gian chạy, hàm khớp với đúng số lượng đối số và loại đối số sẽ được gọi. Hy vọng lời giải thích này sẽ giúp.