C++ chuẩn nói:
7.1.3 Các typedef specifier
Một tên tuyên bố với sự xác định typedef trở thành một typedef-name. Trong phạm vi tuyên bố của nó, một typedef tên là tương đương cú pháp với một từ khóa và tên loại liên kết với số nhận dạng trong cách được mô tả trong Điều 8. Một typedef-name là do đó một từ đồng nghĩa cho loại khác. Tên typedef không không giới thiệu loại mới theo cách khai báo lớp học (9.1) hoặc khai báo enum không
Nhưng ví dụ: class
hoặc struct
giới thiệu các loại mới. Trong ví dụ sau, uniqueUnused
thực sự không có gì nhưng được sử dụng để tạo một loại khác nhau Value<int, 1> != Value<int, 2>
. Vì vậy, có lẽ đây là thứ bạn đang tìm kiếm. Hãy nhớ rằng không có đảm bảo trình biên dịch được thoát khỏi cấu trúc bên ngoài! Việc bảo lãnh chỉ mã này mang đến cho bạn đó là kích thước giống như int
template<typename T, int uniqueUnused>
struct Value
{
Value() : _val({}) {}
Value(T val) : _val(val) { }
T _val;
operator T&() { return _val; }
// evaluate if you with or without refs for assignments
operator T() { return _val; }
};
using Foo = Value<int, 1>;
using Bar = Value<int, 2>;
static_assert(sizeof(Foo) == sizeof(int), "int must be of same size");
static_assert(sizeof(Bar) == sizeof(int), "int must be of same size");
Nếu bạn muốn tạo một kiểu mới dựa trên một lớp học mà bạn có thể dễ dàng đi với ví dụ này (điều này không làm việc với các loại vô hướng từ bạn không thể kế thừa từ ints):
class Foo : public Bar // introduces a new type called Foo
{
using Bar::Bar;
};
Kiểu chữ không phải là loại thực, chúng chỉ là viết tắt hoặc bí danh cho loại thực. – Barmar
Vì vậy, 'foo' và' bar' thực sự là cùng loại, và không có chuyển đổi nào liên quan. – Barmar
Vâng, điều đó rõ ràng. Nhưng hiện đại C + + có một sự thay thế mà không tạo ra một loại mới mà không có một loạt các boilerplate? –