Tôi đã chơi với các tham số mẫu variadic bằng gcc 4.6.1. Các mã sau biên dịch như mong đợi:Loại chức năng trong mẫu không biên dịch
template<typename RetType, typename... ArgTypes>
class Event;
template<typename RetType, typename... ArgTypes>
class Event<RetType(ArgTypes...)>
{
public:
typedef function<RetType(ArgTypes...)> CallbackType;
void emit(ArgTypes...args)
{
for (CallbackType callback : callbacks)
{
callback(args...);
}
}
private:
vector<CallbackType> callbacks;
};
Nhưng để ngạc nhiên của tôi phiên bản sau "bình thường" mà chỉ có một "Loại Đối số" không biên dịch:
template<typename RetType, typename ArgType>
class Event;
template<typename RetType, typename ArgType>
class Event<RetType(ArgType)> // <- error: wrong number of template arguments (1, should be 2)
{};
g ++ 4.6.1 cho lỗi như trong bình luận.
Bất kỳ ai biết tại sao nó gây ra lỗi và cách làm cho nó hoạt động? Ngoài ra, tôi có đúng trong suy nghĩ mã trên là một hình thức "mẫu chuyên môn hóa một phần"?
Dường như trình biên dịch nghĩ RetType (ArgType) là một đối số thay vì khai báo kiểu hàm mà tôi muốn nói. Tự hỏi tại sao nó không thể đối xử với nó theo cách giống như tuyên bố variadic. Và không, nó không phải đệ quy. Sự tăng cường của tôi về việc sử dụng các đối số variadic ở đây là chuyển tiếp khai báo kiểu hàm và sử dụng các đối tượng hàm. –
Kos: Không phải. Đã xóa nhận xét đó. – ronag
H Xu: Tôi không nghĩ phiên bản variadic hoạt động như bạn mong đợi. Tôi nghĩ rằng ArgTypes ... sẽ luôn luôn trống rỗng theo cách bạn đang sử dụng nó. – ronag