cuốn sách gpt4 ai đã làm

c++ - Q : Template class that takes either a normal type or a template template argument

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 18:38:17 28 4
mua khóa gpt4 Nike

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::tupleKhô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 MetaTypeTagstructTypeTag , 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_tagNhư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ẫusẽ 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 trả lời hay nhất

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 constexprchứ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()其中 TLà 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.

Về c++ - Q : Lớp mẫu lấy đối số kiểu bình thường hoặc đối số mẫu mẫu, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/45802194/

28 4 0
Hồ Xil
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress