Tôi không biết nếu tôi có lỗi trình biên dịch hay không thì tôi không biết cú pháp cho những gì tôi đang cố gắng làm. Hãy tưởng tượng một hàm mang theo 2 tài liệu tham khảo mảng:Cú pháp cho các tham số tham chiếu mảng mẫu Denisdic là gì?
void takeArrays(const char (&str1)[4], const char (&str2)[4]) {
}
này biên dịch tốt khi được gọi với:
takeArrays("foo", "bar");
Tại sao tôi muốn làm điều này? Vì việc bỏ qua const char*
mất thông tin kích thước của chuỗi ký tự, và điều đó quan trọng đối với những gì tôi đang làm.
Những gì tôi thực sự muốn làm, tuy nhiên, là vượt qua một số tài liệu tham khảo mảng. Đây là nơi mọi thứ trở nên hơi xấu xí (nó trở nên tồi tệ hơn). Tôi ngây thơ cố gắng này:
template<typename... Args>
void takeArrays(const char (&Args... strs)[4]) {
}
Và có "error: variable or field ‘takeArrays’ declared void"
và "error: expected primary-expression before ‘const’"
(gcc 4.6). Vì vậy, tôi đã thử điều này:
template<typename... Args>
void takeArrays(const char (&(Args... strs))[4]) {
}
Và nhận "no matching function for call to ‘takeArrays(const char [4], const char [4])’"
và "candidate is template<class ... Args> void takeArrays(const char (& (*)(Args ...))[4])"
. Đó là không đọc được nhưng có vẻ gần với những gì tôi muốn. Tôi đã thử nhiều biến thể và dường như không thể biến nó thành biên dịch.
Giả sử có một cách thích hợp để viết ở trên, những gì tôi thực sự muốn làm là gọi:
takeArrays("foo", "foobar", "longerstring");
Và nhận được một danh sách variadic của mảng có kích thước khác nhau, tức là các cuộc gọi trên nên được mở rộng bằng các trình biên dịch:
void takeArrays(const char (&str1)[4], const char (&str2)[7],
const char (&str3)[13]);
nào là suy nghĩ đầu tiên tôi đã cố gắng làm, và cố gắng của tôi là một cái gì đó như:
template<size_t... Sizes>
void takeArrays(const char (&strs)[Sizes]...);
Không cần phải nói tất cả những gì tôi nhận được là thông báo lỗi. Tôi biết rằng những gì tôi đang cố gắng làm là một chút điên rồ nhưng tôi thực sự muốn biết nếu nó có thể, và nếu như vậy, cú pháp thích hợp là gì. Cảm ơn trước.
Yep, đã hoạt động. Cảm ơn! Tôi sẽ nhớ dấu ba chấm trước tên lừa tham số. Trong tò mò, làm cách nào để viết các thông số ban đầu có cùng kích thước? Tôi đã thử 'template void takeArrays (tiếp char Args (& ... args ([4])' và 'const char (Args & ... args) [4]' và không –
@ ÁtilaNeves Điều đó không thể được thực hiện để làm việc vì lý do tương tự mà bạn không thể viết một mẫu hàm variadic lấy nhiều 'int': 'template * những gì để đặt ở đây ?? * /> void foo (int ... i/* không hoạt động: không có gói để mở rộng ở đây * /); 'Cách giải quyết thông thường sẽ là cho phép các mảng có cùng kích thước với kiểu phần tử khác nhau, tức là' template void foo (T (& ... args) [Size]); '. Sau đó bạn có thể thêm' static_assert' để thực thi tất cả 'T' là' const char'. –