Gần đây tôi đã thiết kế các siêu dữ liệu và các hoạt động có thể cho phép liên kết loại thời gian biên dịch:
#include
mẫu<> tên kiểu T>
cấu trúc MetaTypeTag
{};
/*Trình trợ giúp mẫu biến*/
mẫu<> tên kiểu T>
constexpr MetaTypeTag meta_type_tag = {};
mẫu
structTypeTag
{};
/*so sánh*/
mẫu
constexpr bool operator==(TypeTag, TypeTag) { return true }
mẫu
constexpr bool operator==(TypeTag, TypeTag) { return false }
/*Trình trợ giúp mẫu biến*/
mẫu
constexpr TypeTag type_tag = {};
mẫu<> tên kiểu T, tên kiểu... Ts>
constexpr TypeTag<>> kết hợp(MetaTypeTag, TypeTag...)
{
trở lại {};
}
int main()
{
constexpr auto kết hợp_tag = kết hợp(meta_type_tag, type_tag, type_tag);
static_assert(combined_tag == type_tag<>>, "");
}
std::tuple
Không thể được sử dụng làm loại không có tham số mẫu nhưng vẫn có thể xuất hiện trong tham số mẫu mẫu.
Bây giờ nếu chúng ta cố gắng tiến thêm một bước nữa, câu hỏi đặt ra là liệu có cách nào để thống nhấtcấu trúc MetaTypeTag
Và structTypeTag
, vì cả hai đều là các lớp trống với một tham số mẫu hoặc ít nhất có thể sử dụng cùng một biến mẫu loại_tag
Nhưng chuyển hướng đến các lớp khác nhau dựa trên loại loại? Vì vậy, tôi sẽ tưởng tượng một cái gì đó như thế này:
mẫu??>
constexpr auto type_tag = ????{};
// sử dụng với 'loại không đầy đủ'
type_tag //MetaTypeTag
// sử dụng với kiểu thông thường
type_tag //TypeTag
Tôi đã thử mọi cách có thể - xác định lại, chuyên môn hóa rõ ràng, chuyên môn hóa một phần, tham số mẫu tùy chọn, sử dụng bí danh có điều kiện, nhưng không có gì hiệu quả. Tôi đã hy vọng vào C++ 17 mẫu
sẽ hữu ích, nhưng hóa ra người ta chỉ làm việc với những loại không phải loại.
câu hỏi là liệu có cách nào để thống nhất cấu trúc MetaTypeTag
and structTypeTag
, vì cả hai đều là các lớp trống với một tham số mẫu
Tôi không nghĩ vậy. Điều tốt nhất tôi có thể tưởng tượng để đơn giản hóa mã của bạn một chút (rất ít) là xác định một vài tình trạng quá tải constexpr
chức năng, nóigetTag()
mẫu
tự động constexpr getTag ()
{ trả về TypeTag{} }
mẫu tên kiểu T>
tự động constexpr getTag ()
{ trả về MetaTypeTag{} }
Vì vậy bạn có thể gọigetTag()
其中 T
Là một loại hoặc mẫu.
Vì vậy bạn có thể gọikết hợp()
như sau
constexpr tự động kết hợp_tag
= kết hợp(getTag(), getTag(), getTag());
Nhưng tôi không nghĩ đó là một cải tiến lớn.
Tôi là một lập trình viên xuất sắc, rất giỏi!