2014-10-09 26 views
17

Giả sử chúng ta có một lớpChức năng như các đối số của mẫu variadic

template <int(*F)(int, int)> 
class A { 
    // ... 
}; 

Phải mất một chức năng như một mẫu đối số.

Bây giờ tôi muốn thực hiện một mẫu variadic, trong đó có chức năng như các thông số mẫu.

template <int(*F...)(int, int)> // this won't compile 
template <int(*F)(int, int)...> // this won't compile either 

Làm cách nào để thực hiện đúng?

+1

Vì vậy, bạn đã nhận được lỗi biên dịch nào? – Useless

+2

Dấu ba chấm luôn là "ngay trước" tên, trong trường hợp này là 'F'. – leemes

Trả lời

12
template <int(*...F)(int, int)> 
class A { 
    // ... 
}; 
18

Bạn có thể làm

using Function_t = int(*)(int, int); 

template <Function_t ... Fs> struct s{}; 

khác, nếu bạn không muốn sử dụng typedef

template <int(*...Fs)(int, int)> struct s{}; 

Note: phiên bản thứ hai không thể được ẩn danh (Fs là bắt buộc) theo ISO C++ 11 yêu cầu một khai báo gói được mã hóa để có một tên.

3

Chỉ cần sử dụng F làm đối số mẫu. Điều này không chỉ cho phép bạn sử dụng chức năng như tham số mà còn các loại khác thực hiện toán tử dấu ngoặc đơn. Các lớp học này được gọi là functors.

+4

Có thể là một đề xuất khôn ngoan nhưng không phải là một giải pháp cho vấn đề. Cũng lưu ý rằng ở đây, bản thân các hàm là các tham số mẫu, không chỉ là kiểu của chúng. Trong trường hợp của bạn, các kiểu của functor sẽ là các tham số mẫu, nhưng (tùy thuộc vào nơi chúng được sử dụng), bạn cần chuyển chúng thành các đối số hàm. – leemes

2

Cú pháp kiểu con trỏ hàm là gây phiền nhiễu. Vì vậy, mã xung quanh nó:

template<class T> using type=T; 

template< type<int(int,int)>* ... Fs > 
class A { 
}; 
+0

Mặc dù thú vị, việc sử dụng các cú pháp khác nhau cho các chức năng kiểu này trông có vẻ lạ. Có lẽ 'con trỏ '? – dyp

+0

@dyp Tôi muốn mọi thứ đọc từ trái sang phải giống như các biến "bình thường", và 'pointer ' không làm điều đó. – Yakk

+0

Bạn cũng có thể bắt đầu khai báo các biến thông thường như sau: 'pointer x; mảng f; tham chiếu >>> s; ';) - hmm có tên là toán tử kiểu? – dyp

Các vấn đề liên quan