2015-06-11 12 views
6

Tại sao không có loại cụ thể nào được phép trong gói mẫu variadic?Các thông số mẫu biến thể của một loại cụ thể

template< typename T > 
class Foo 
{ 
public: 
    template< typename... Values > 
    void bar(Values... values) 
    { 
    } 

    template< T... values >   <-- syntax error 
    void bar(T... values) 
    { 
    } 

    template< int... values >   <-- syntax error 
    void bar(int... values) 
    { 
    } 
}; 

Lý do cơ bản trong không phải là cho phép điều này?
Có đề xuất cho việc này không?


Lưu ý: lựa chọn thay thế sẽ là

  • std::initializer_list<T> mà không thu hẹp của các loại và { } -brace-cú pháp
  • một (xấu xí) đặc điểm đệ quy để kiểm tra tất cả các loại riêng rẽ: see here

Trả lời

6

Nó được cho phép, thực sự, bạn chỉ sử dụng nó sai. T...int... là các gói tham số không phải kiểu và các phần tử của chúng là các giá trị, vì vậy bạn không thể sử dụng chúng làm kiểu chỉ định (và bạn không thể suy ra chúng từ một cuộc gọi hàm).

Một ví dụ về việc sử dụng đúng:

template<int... Is> 
struct IntPack {}; 

IntPack<1,2,3> p; 

hoặc

template< typename T > 
struct Foo 
{ 
    template< T... Ts> 
    void bar() 
    { 
    } 
}; 

int main() 
{ 
    Foo<int> f; 
    f.bar<1,2,3>(); 
} 

Một ví dụ khác sẽ std::integer_sequence.

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