Tiếp tục my journey into the world of variadic templates, tôi gặp phải sự cố khác.Chuyên môn mẫu từng phần với nhiều gói thông số mẫu
Giả sử các lớp mẫu sau:
template < typename T >
struct foo
{
//default implementation
};
nó có thể một phần chuyên nó cho variadic mẫu instantiations như thế này:
template < template < typename ... > class T, typename ...Args >
struct foo< T<Args...> >
{
//specialized implementation
};
Với điều này, foo<int>
sẽ tương ứng với việc thực hiện mặc định và foo< std::tuple< int, char > >
thực hiện chuyên ngành.
Tuy nhiên, mọi thứ trở nên phức tạp hơn khi sử dụng một số thông số mẫu. Ví dụ, nếu chúng ta có các lớp mẫu sau
template < typename T, typename U >
struct bar {};
và chúng tôi muốn một phần chuyên nó như chúng tôi đã làm cho foo
, chúng ta không thể làm
template < template < typename ... > class T, typename ...TArgs,
template < typename ... > class U, typename ...UArgs >
struct bar< T<TArgs...>, U<UArgs...> > {};
//This would correspond to the specialized version with
//T=std::tuple,
//TArgs=int,char
//U=std::tuple,
//UArgs=float
bar< std::tuple< int, char >, std::tuple<float> > b;
Thật vậy, nếu tôi đúng, chúng tôi chỉ có thể có một gói tham số mẫu và nó phải được đặt ở cuối danh sách tham số. Tôi hiểu tại sao điều này là bắt buộc trong các khai báo mẫu, nhưng đối với một số chuyên môn mẫu từng phần nhất định (như ví dụ trên), đây không phải là vấn đề.
Có thể đạt được chuyên môn mẫu từng phần với nhiều gói thông số mẫu không?
Sửa: Bây giờ tôi cảm thấy ngớ ngẩn ... mã tôi đã ở trên biên dịch một cách hoàn hảo (ít nhất là với gcc 4.5). Lỗi biên dịch mà tôi đã có không phải do nhiều gói tham số, mà là vì chúng sử dụng như các tham số hàm thành viên. Trong chuyên môn hóa từng phần của bar
, tôi đã cố gắng để xác định một hàm thành viên đó phải mất cả TArgs
và UArgs
thông số:
template < template < typename ... > class T, typename ...TArgs,
template < typename ... > class U, typename ...UArgs >
struct bar< T<TArgs...>, U<UArgs...> >
{
void method(TArgs... targs, UArgs... uargs) //compile error here
{
}
};
Trên khai báo hàm thành viên, gcc mang lại cho tôi những lỗi
thông số gói phải ở cuối danh sách tham số.
Theo như tôi có thể biết, trình biên dịch sẽ có thể xác định hàm thành viên chính xác cho một bản mẫu đã cho, ví dụ: bar< std::tuple< int, char >, std::tuple<float> >
phải chứa hàm thành viên void method(int, char, float)
. Tôi có làm điều gì sai? Hay tôi đang cố gắng làm điều gì đó không thể? Nếu vậy, có lý do chính đáng tại sao điều này là không thể?
Gọn gàng, tôi không biết bạn có thể chuyên/chỉ định (một phần) các thành phần của danh sách mẫu làm bản thân mẫu. – JAB