Đoạn code dưới đây làm việc cho: Mục tiêu cho các hoạt động tổng kết trái: sum(1,2,3,4);
mẫu variadic hoạt động tổng kết trái
Tuy nhiên, nó sẽ không hoạt động chính xác cho sum(1,2,3,4,5)
hoặc sum(1,2,3,4,5,...)
. Bất kỳ điều gì có hơn 4 đối số đều có lỗi:
error: no matching function for call to sum(int, int, int, int, int)
=================================
template <typename T>
T sum(const T& v) {
return v;
}
template <typename T1, typename T2>
auto sum(const T1& v1, const T2& v2) -> decltype(v1 + v2) {
return v1 + v2;
}
template <typename T1, typename T2, typename... Ts>
auto sum(const T1& v1, const T2& v2, const Ts&... rest) -> decltype(v1 + v2 + sum(rest...)) {
return v1 + v2 + sum(rest...);
}
int main() {
cout << sum(1,2,3,4); //works correctly
//cout << sum(1,2,3,4,5); //compile error
}
tôi đoán là nó không thể evauluate tổng sử dụng mẫu varidic recursivly trước khi nó được decleared người. Tôi không có đầu mối mặc dù làm thế nào để giải quyết nó. Không thể nào? – Xale
Tôi có thể tạo lại vấn đề đó trên gcc 4.7.2: http://ideone.com/6X4f2b - có vẻ như gcc từ chối gọi các mẫu variadic với các kiểu trả về tự động/từ chối một cách đệ quy. –
Xem [link] [1] này. Gần câu hỏi giống hệt nhau. [1]: http://stackoverflow.com/questions/3744400/trailing-return-type-using-decltype-with-a-variadic-template-function – Xale