Làm thế nào để lấy kiểu dữ liệu của một biến?


8

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

5
Tại sao bạn cần phải làm điều này? loại biến nên được biết đến kể từ khi bạn khai báo
sachleen

Câu trả lời:


14

Trong một chương trình C ++ điển hình, bạn sẽ sử dụng typeidtoá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 typeoftoá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.


câu trả lời rất nhiều thông tin và kỹ lưỡng! sẽ đánh giá cao hơn loại này
Omer

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.


Bạn có thể mở rộng câu trả lời của mình một chút , giải thích ngắn gọn về cách thức hoạt động của nó?
Greenonline

tôi đã phải viết lại bằng tay vì sao chép dán dẫn đến các vấn đề tôi không hiểu. Sau khi thử lại nó bằng tay giống như bản phác thảo, nó hoạt động như một lá bùa. Khá hữu ích ...
novski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.