2013-04-11 47 views
5

Hãy xem xét một mẫu lớp C với một chính sách thiết lập thông qua mẫu template tham số và hai định nghĩa chính sách:Template mẫu tham số với sai số của các tham số mẫu

template<class T> struct PolicyOne { }; 
template<class T, int U, int V> struct PolicyTwo { }; 
template<class T, template<class> class POLICY> struct C { POLICY<T> policy; }; 

void f() 
{ 
    C<int, PolicyOne> mc1; 
    C<int, PolicyTwo<1, 2> > mc2; // doesn't work this way 
} 

PolicyTwo không làm việc vì sai số lập luận mẫu. Có cách nào để sử dụng tham số mẫu PolicyTwo làm POLICY nếu bạn chỉ định loại cho thông số mẫu bổ sung không?

Tôi đang sử dụng C++ 03, vì vậy khai báo bí danh không khả dụng. Tôi biết về số this question, nhưng tôi không thấy giải pháp cho vấn đề của mình ở đó.

Trả lời

3

Tùy thuộc vào cách chính sách được sử dụng, bạn có thể quản lý với thừa kế ở vị trí của alias mẫu:

template<int U, int V> struct PolicyTwoAdaptor { 
    template<class T> struct type: PolicyTwo<T, U, V> { }; }; 
C<int, PolicyTwoAdaptor<1, 2>::type> mc2; 
0

Tôi không thể nhìn thấy hwo để giải quyết việc này với cơ chế hiện tại của bạn, nhưng bạn có thể đảo ngược cách nó hoạt động và nó sẽ biên dịch tốt (và thậm chí có thể làm giảm độ phức tạp bằng cách loại bỏ các lớp mẫu tham số):

template <typename T> struct PolicyBase { typedef T value_type; }; 
template<class T> struct PolicyOne : public PolicyBase<T> { }; 
template<class T, int U, int V> struct PolicyTwo : public PolicyBase<T> { }; 
template<class POLICY> struct C { POLICY policy; typedef typename POLICY::value_type T; }; 

void f() 
{ 
    C<PolicyOne<int> > mc1; 
    C<PolicyTwo<int, 1, 2> > mc2; // doesn't work this way 
} 

Ý tưởng cơ bản là di chuyển tham số kiểu tempalte ra khỏi người dùng chính sách và thay vào đó, hãy đưa ra một chính sách được khởi tạo đầy đủ. Sau đó, chính sách cung cấp kiểu mẫu của nó cho người dùng chính sách thông qua một typedef (nếu cần).

+0

Giải pháp này không làm việc cho tôi bởi vì nó không cho phép tôi để khai báo một giá trị mặc định cho 'POLICY' hoạt động độc lập với' T'. –

+0

@Gabriel Schreiber Chính sách của bạn chỉ đơn giản là có thể chọn bỏ qua tham số kiểu mẫu của nó (trong khi vẫn lộ loại của nó), và sau đó nó hoạt động độc lập với 'T'. –

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