Trang tài liệu
Khóa học C++ nền tảng
Chương 12. Mẫu (Template)
Khuôn mẫu hàm variadic

Khuôn mẫu hàm variadic

Các khuôn mẫu hàm variadic là một tính năng trong C++11 cho phép bạn xác định một mẫu có số lượng đối số thay đổi. Điều này đặc biệt hữu ích khi bạn cần viết một hàm hoặc lớp có thể chấp nhận các số và loại đối số khác nhau.

Cú pháp

Cú pháp cho các khuôn mẫu hàm variadic rất đơn giản. Để xác định một khuôn mẫu hàm variadic, hãy sử dụng ký hiệu ... (dấu chấm lửng):

template <typename... Args>

Ký hiệu này đại diện cho một gói tham số, có thể chứa 0 hoặc nhiều đối số. Bạn có thể sử dụng gói tham số này làm danh sách biến của các tham số khuôn mẫu trong định nghĩa khuôn mẫu của mình.

Ví dụ

Tổng hợp nhiều đối số bằng cách sử dụng các khuôn mẫu hàm variadic

#include <iostream>
 
// Trường hợp cơ sở cho đệ quy
template <typename T>
T sum(T t) {
  return t;
}
 
// Khuôn mẫu hàm variadic
template <typename T, typename... Args>
T sum(T t, Args... args) {
  return t + sum(args...);
}
 
int main() {
  int result = sum(1, 2, 3, 4, 5);  // mở rộng đến 1 + 2 + 3 + 4 + 5
  std::cout << "The sum is: " << result << std::endl;
 
  return 0;
}

Lớp Tuple sử dụng khuôn mẫu hàm variadic

template <typename... Types>
class Tuple;
 
// Trường hợp cơ sở: tuple empty
template <>
class Tuple<> {};
 
// Trường hợp đệ quy: Tuple có một hoặc nhiều phần tử
template <typename Head, typename... Tail>
class Tuple<Head, Tail...> : public Tuple<Tail...> {
 public:
  Tuple(Head head, Tail... tail) : Tuple<Tail...>(tail...), head_(head) {}
 
  Head head() const { return head_; }
 
 private:
  Head head_;
};
 
int main() {
  Tuple<int, float, double> tuple(1, 2.0f, 3.0);
  std::cout << "First element: " << tuple.head() << std::endl;
  return 0;
}

Xin lưu ý rằng các ví dụ hiển thị là dành cho mục đích giáo dục và có thể không phải là triển khai hiệu quả nhất hoặc sẵn sàng để sản xuất. Với C++ 17 trở đi, thậm chí còn có nhiều cách ngắn gọn hơn để xử lý các khuôn mẫu hàm variadic, chẳng hạn như sử dụng biểu thức gấp.