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

c++ - bắt đầu chung, thêm decltype xem xét khai báo sử dụng cục bộ

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 15:24:59 26 4
mua khóa gpt4 Nike

Vòng lặp ranged-for của C++ 0x có một ngoại lệ đặc biệt để xử lý mảng (FDIS §6.5.4) và có hai hàm std::begin và end, bị quá tải để xử lý mảng hoặc chọn phương thức bắt đầu/kết thúc. Điều này khiến tôi tin rằng tôi có thể viết một hàm chấp nhận một chuỗi chung để khớp với hành vi của một phạm vi vòng lặp for:

mẫu
khoảng trống f(C &c) {
sử dụng std::begin;
sử dụng std::end;
do_something_with(bắt đầu(c), kết thúc(c));
}

Nếu có phần bắt đầu/kết thúc "cụ thể hơn" trong không gian tên của C, thì nó sẽ được chọn thông qua ADL, nếu không thì mã "mặc định" là std::begin/end.

Tuy nhiên, ranged-for có ngoại lệ đặc biệt này là có lý do. Nếu bạn chuyển một mảng thuộc một loại trong không gian tên có phần bắt đầu/kết thúc với các ngữ nghĩa khác nhau làm con trỏ, thì dạng mảng std::begin/end sẽ không được chọn:

không gian tên ns {
cấu trúc A {};
void started(A*); // Thực hiện điều gì đó hoàn toàn khác với std::begin.
}

void f_A() { // Hãy tưởng tượng f() ở trên được gọi với một mảng các đối tượng ns::A.
ns::A c[42];
sử dụng std::begin;
Begin(c); // Chọn ns::begin, không phải dạng mảng của std::begin!
}

Để tránh điều này, có giải pháp nào tốt hơn là viết trình bao bọc bắt đầu/kết thúc của riêng tôi (sử dụng ADL nội bộ) và gọi chúng một cách rõ ràng thay vì std::begin hoặc ADLized started?

không gian tên của tôi {
mẫu
auto started(T &c) // Đồng thời quá tải trên T const &c, giống như std::begin.
-> decltype(...) // Xem bên dưới.
{
sử dụng std::begin;
trở lại bắt đầu (c);
}

mẫu
T* bắt đầu(T (&c)[N]) {
trả lại c;
}
}
// my::end bị bỏ qua, nhưng nó tương tự như my::begin.

mẫu
khoảng trống f(C &c) {
do_something_with(my::begin(c), my::end(c));
}

Tuy nhiên, như các dấu chấm lửng ở trên cho thấy, tôi thậm chí còn không biết cách viết my::begin! Đối với loại decltype đó, làm cách nào để chọn loại sẽ được chọn thông qua khai báo cục bộ và ADL?

câu trả lời hay nhất

Tôi gặp phải tình huống tương tự khi sử dụng bộ dữ liệu:

mẫu
tự động f(Bộ&& bộ)
-> /* ??? */
{
sử dụng std::get;
trả về get(tuple);
}

Chấp nhận cả hai std::tupletăng :: tuple , và chấp nhận giá trị và giá trị thay vì mẫu tự động f(std::tuple& tuple) -> /* ??? */ .

Trường hợp đặc biệt này được giải quyết bằng một lớp đặc điểm, lớp này thực sự được cung cấp theo tiêu chuẩn:std::tuple_element .Như với các lớp đặc điểm, ý tưởng là bộ đồlà một giao thức và bất kỳ thứ gì muốn tuân thủ nó đều phải cung cấp sự chuyên môn hóa, ví dụ:tuple_element .Vì vậy, theo như tôi lo ngại, giải pháp đã tồn tại.

Trong trường hợp của bạn, nếu bạn đang viết một thư viện, tôi khuyên bạn nên viết (và ghi lại) một lớp đặc điểm như vậy. Trong mã ứng dụng hay cái gì khác, tôi không chắc chắn.

Về c++ - bắt đầu nói chung, thêm decltype Xem xét khai báo sử dụng cục bộ, 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/6045054/

26 4 0
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