2009-07-22 7 views
10

Có thể truy cập các giá trị của các tham số mẫu không kiểu trong lớp mẫu chuyên biệt không?Có thể truy cập các giá trị của các tham số mẫu không kiểu trong lớp mẫu chuyên biệt không?

Nếu tôi có lớp mẫu với chuyên môn:

template <int major, int minor> struct A { 
     void f() { cout << major << endl; } 
    } 

    template <> struct A<4,0> { 
     void f() { cout << ??? << endl; } 
    } 

Tôi biết nó là trường hợp ở trên nó là đơn giản để hardcode giá trị 4 và 0 thay vì sử dụng các biến nhưng những gì tôi có một lớp học lớn mà tôi đang chuyên và tôi muốn có thể truy cập các giá trị.

Có thể trong A < 4,0> để truy cập majorminor giá trị (4 và 0) không? Hoặc tôi phải gán chúng vào mẫu instantiation như hằng số:

template <> struct A<4,0> { 
     static const int major = 4; 
     static const int minor = 0; 
     ... 
    } 
+0

Nếu bạn chuyên dựa trên giá trị thì điều đó ngụ ý rằng có điều gì đó đặc biệt về những giá trị cụ thể đó. Nếu bạn sử dụng chúng như các giá trị chung trong toàn bộ khuôn mẫu và chỉ coi chúng là đặc biệt ở một vài nơi, bạn có thể trừu tượng hóa hành vi đặc biệt thành một mẫu lớp chuyên biệt nhỏ hơn để lại mẫu lớn hoàn toàn chung chung và không chuyên biệt. Đó là một chút khó khăn để nói như vậy bạn có thể mở rộng câu hỏi của bạn để được nhiều hơn 'thực'? –

+0

Tôi nghĩ câu hỏi là đủ thực tế. Tôi có lớp cơ sở hiện có thực hiện hành vi cụ thể dựa trên phiên bản giao thức. Trước đây nó có một thành viên trả về phiên bản giao thức - vì thành viên đó không còn tồn tại nữa, đó là phương thức ghi nhật ký đã bao gồm phiên bản giao thức trong đầu ra. Tôi chỉ có thể hardcode các giá trị nhưng tôi muốn biết nếu có cách tốt hơn. Câu trả lời được chấp nhận cung cấp cách làm tốt - tôi thực sự sử dụng các đặc điểm theo cách tương tự ở những nơi khác - để nhận các kiểu tham số nhưng ý định là như nhau. – stefanB

Trả lời

16

Đây là loại vấn đề có thể được giải quyết bằng cách có một bộ cấu trúc "Đặc điểm" riêng biệt.

// A default Traits class has no information 
template<class T> struct Traits 
{ 
}; 

// A convenient way to get the Traits of the type of a given value without 
// having to explicitly write out the type 
template<typename T> Traits<T> GetTraits(const T&) 
{ 
    return Traits<T>(); 
} 

template <int major, int minor> struct A 
{ 
    void f() 
    { 
     cout << major << endl; 
    } 
}; 

// Specialisation of the traits for any A<int, int> 
template<int N1, int N2> struct Traits<A<N1, N2> > 
{ 
    enum { major = N1, minor = N2 }; 
}; 

template <> struct A<4,0> 
{  
    void f() 
    { 
     cout << GetTraits(*this).major << endl; 
    } 
}; 
+0

+1 tốt, cảm ơn – stefanB

1

Không thực sự là một câu trả lời cho câu hỏi của bạn, nhưng bạn có thể liệt kê chúng, tức là:

enum{ 
specialisationMajor=4, 
specialisationMinor=0 
}; 

template <> struct A<specialisationMajor,specialisationMinor> { 
    static const int major = specialisationMajor; 
    static const int minor = specialisationMinor; 
    ... 
} 
+0

Tôi đang cố gắng tránh xác định một tập hợp các biến khác ... đó là vẻ đẹp của việc có các tham số mẫu đó, tôi không 'thường muốn truy cập các giá trị ... nhưng không bao giờ, nhưng cảm ơn – stefanB