Câu hỏi gần như không có ý nghĩa nếu không có ví dụ. Vì vậy, đây là những gì tôi đang cố gắng làm.Tại sao sử dụng gói tham số giá trị tích phân không được phép sau khi gói tham số kiểu trong C++ 11?
Nói chung C++ cho phép như sau:
template<class T, class U, T t, U u>
void func() {}
func<char, int, 'A', 10>();
Nhưng nó có vẻ như phần mở rộng variadic tự nhiên của nó không hoạt động.
template<class...T, T... t>
void func() {}
func<char, int, 'A', 10>();
Cả hai clang và g ++ 4.7 từ chối mã trên. Lỗi được hiển thị nơi diễn ra quá trình tạo bản đồ. Nó xuất hiện với tôi rằng hai danh sách variadic nên được phân tích cú pháp một cách rõ ràng bởi vì danh sách đầu tiên có các kiểu và một danh sách khác chỉ có giá trị tích phân.
Nếu ở trên không có nghĩa là để làm việc, tôi nghĩ rằng sau đây sẽ không hoạt động.
template <class Ret, class... Args, Ret (*func)(Args...)>
class Foo {};
Tôi nghĩ mẫu Foo là một điều khá hữu ích để có.
Mẫu 'Foo' sẽ giống như nói' template ', tham số mẫu cuối cùng thực sự không thêm gì cả và do đó hoàn toàn unicecary, sau đó loại có thể được biểu hiện tốt bằng cách sử dụng tham số mẫu (ví dụ 'typedef Ret (* func) (Args ...)' bên trong 'Foo') –
Grizzly
@Grizzly: Tham số cuối cùng không cung cấp * type * (có thể được thay thế bởi typedef), nó cung cấp một con trỏ hàm. Một con trỏ hàm được thay thế tại thời gian biên dịch, do đó cho phép tối ưu hóa cross-procedural như inlining. –
@Sumant: Bạn nói đúng là nó có vẻ không rõ ràng, tuy nhiên tôi nghĩ tiêu chuẩn đơn giản chỉ nhằm mục đích đơn giản ở đây bằng cách xác định rằng một gói tham số là "tham số" cuối cùng và không có gì có thể đến sau đó. Điều này làm cho phù hợp dễ dàng hơn. –