2014-04-09 13 views
8

Ví dụ tôi có một mã như dưới đây với hai gói tham sốCách sử dụng hai gói thông số cùng nhau?

template<class... Ts, int... Is> 
struct B 
{ 

}; 

int main() 
{ 
    B<int, double, 0, 1> b; // compile error here 
    return 0; 
} 

Bất kỳ cách nào để có được là đúng?

+3

B chỉ lấy 2 tham số kiểu, sau đó sử dụng 'B , intlist <0,1>>'. –

+5

Tôi nghĩ rằng bạn có nghĩa là để nói hai gói tham số, không phải hai mẫu variadic. – chris

+0

'B , 0, 1>' sẽ hoạt động. Tất cả những gì bạn cần để định nghĩa 'typelist' chỉ là một dòng. Xem câu trả lời của tôi. – Nawaz

Trả lời

6

Đó là không được phép. Tuy nhiên, bạn có thể thực hiện việc này:

template<typename ...> struct typelist {}; 

template<typename TypeList, int... Is> 
struct B;        //primary template. Only declaration! 

template<typename ... Ts, int ... Is> 
struct B<typelist<Ts...>, Is...>   //partial specialization 
{ 
    //here you know Ts... and Is... Use them! 
}; 

int main() 
{ 
    B<typelist<int, double>, 0, 1> b; 
    return 0; 
} 
+0

Tốt. Struct của bạn 'typelist', tôi thường gọi nó là' gói'. – iavr

2

Bạn có thể giới thiệu các mẫu helper để giới thiệu danh sách các loại/số nguyên:

template<typename TList, typename IList> struct X; 

template< 
    template<typename ...> class TList, typename ...Ts, 
    template<int ...> class IList, int ...Is> 
struct X <TList<Ts...>, IList<Is...> > 
{ 

}; 

template<typename ...Ts> struct TList {}; 
template<int ...Is> struct IList {}; 

int main() 
{ 
    X<TList<int, double>, IList<0, 1> > x; 
    return 0; 
} 
+0

'IList' là không cần thiết nếu' TList' ở đó. – Nawaz

+0

Tôi biết, nhưng nó trông sạch hơn với tôi. –

+0

Như tôi thấy, '' template class TList, typename ... Ts "' trông xấu hơn với tôi, so với chỉ 'typename TypeList'. : | ... Nhưng sau đó điều này không liên quan gì đến bình luận trước đó của tôi, bởi vì nó có thể được viết lại để làm cho nó tốt hơn. – Nawaz

2

Tôi nghĩ rằng điều này gặp phải vấn đề XY. Nếu tôi đã hiểu rõ, những gì bạn muốn là vượt qua bất kỳ số lượng các loại khác nhau.

Bạn có thể làm điều đó bằng std::integral_constant:

template<typename... INTS> 
struct foo 
{ 
    ... 
}; 

template<typename T , T n> 
using number = std::integral_constant<T,n>; //An alias for less typing... 

foo<number<int,-1>,number<unsigned int,1>, /* etc */>; 

Nếu thats không phải những gì bạn muốn, tôi sẽ sử dụng cách tiếp cận typelist từng phần chuyên môn hóa khác gợi ý.

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