Dynamic Typing trong C++
C++ được biết đến như một ngôn ngữ kiểu tĩnh, có nghĩa là kiểu dữ liệu của các biến của nó được xác định tại thời điểm biên dịch. Tuy nhiên, C++ cũng cung cấp các khái niệm để có một mức dynamic typing nhất định, nghĩa là xác định kiểu dữ liệu của các biến trong thời gian chạy.
Dưới đây là tổng quan ngắn gọn về hai cách để đạt được dynamic typing trong C++:
Con trỏ void*
Con trỏ void* là một con trỏ chung có thể trỏ tới các đối tượng thuộc bất kỳ kiểu dữ liệu nào. Chúng có thể được sử dụng để lưu trữ một tham chiếu đến bất kỳ loại đối tượng nào mà không cần biết loại đối tượng cụ thể.
Ví dụ:
#include <iostream>
int main() {
int x = 42;
float y = 3.14f;
std::string z = "Hello, world!";
void* void_ptr;
void_ptr = &x;
std::cout << "int value: " << *(static_cast<int*>(void_ptr)) << std::endl;
void_ptr = &y;
std::cout << "float value: " << *(static_cast<float*>(void_ptr)) << std::endl;
void_ptr = &z;
std::cout << "string value: " << *(static_cast<std::string*>(void_ptr)) << std::endl;
return 0;
}
std::any (C++17)
C++17 đã giới thiệu lớp std::any đại diện cho một vùng chứa an toàn kiểu tổng quát cho các giá trị đơn lẻ thuộc bất kỳ loại nào.
#include <iostream>
#include <any>
int main() {
std::any any_value;
any_value = 42;
std::cout << "int value: " << std::any_cast<int>(any_value) << std::endl;
any_value = 3.14;
std::cout << "double value: " << std::any_cast<double>(any_value) << std::endl;
any_value = std::string("Hello, world!");
std::cout << "string value: " << std::any_cast<std::string>(any_value) << std::endl;
return 0;
}
Ví dụ: Hãy nhớ rằng cả hai con trỏ void* và std::any đều có ý nghĩa về hiệu suất do việc kiểm tra và truyền kiểu bổ sung diễn ra trong thời gian chạy. Chúng nên được sử dụng cẩn thận và chỉ khi thực sự cần thiết.