2012-10-02 54 views
9

Tôi đang cố gắng thực hiện một số công cụ chuyên môn hóa một phần. Tôi có một tuple và tôi muốn lặp lại từ một chỉ mục phần tử nào đó đến chỉ mục tuple đầu tiên, tích lũy một giá trị từ mỗi loại trong tuple. Điều này có vẻ là một vấn đề đơn giản khi sử dụng một bản mẫu đệ quy.Chuyên môn hóa một phần các mẫu có thông số nguyên

Vấn đề là, tôi dường như không thể làm cho đệ quy hoạt động. Để dừng đệ quy, tôi cần một phần chuyên chức năng mẫu tại chỉ số tuple 0. Điều đó dường như đủ đơn giản, nhưng nó không hoạt động.

Lưu ý: Tôi đã xóa nội dung tuple thực tế khỏi ví dụ, vì nó không liên quan; đó là chuyên môn mẫu không hoạt động.

template<int Index, typename Tpl> 
size_t CalcInterleaveByteOffset(const Tpl &t) 
{ 
    size_t prevOffset = CalcInterleaveByteOffset<Index - 1>(t); 
    return prevOffset + sizeof(Tpl); 
} 

template<typename Tpl> 
size_t CalcInterleaveByteOffset<0, Tpl>(const Tpl &t) 
{ 
    return 0; 
} 

GCC simply says that this kind of specialization is not allowed. Điều đó có đúng không? Có cách nào khác để xử lý thứ này không?

Trả lời

11

Theo quy tắc, bất kỳ hình thức chuyên môn mẫu từng phần nào đều không được phép đối với các hàm. Tuy nhiên nó được phép cho các lớp học. Vì vậy, giải pháp chỉ đơn giản là để di chuyển chức năng của bạn đến một thành viên tĩnh của một lớp chủ templated.

Nếu bạn cần suy luận các đối số mẫu, bạn có thể chỉ cần tạo hàm bao bọc gọi lớp được tạo khuôn mẫu.

Kết quả là một cái gì đó như thế này:

template<int Index, typename Tpl> 
class CalcInterleaveByteOffsetImpl 
{ 
    static size_t CalcInterleaveByteOffset(const Tpl &t) 
    { 
    // This is OK it calls the wrapper function 
    // You could also do 
    // size_t prevOffset = CalcInterleaveByteOffsetImpl<Index - 1, Tpl>::CalcInterleaveByteOffset(t); 
    size_t prevOffset = ::CalcInterleaveByteOffset<Index - 1>(t); 
    return prevOffset + sizeof(Tpl); 
    } 
}; 

template<typename Tpl> 
class CalcInterleaveByteOffsetImpl<0, Tpl> 
{ 
    static size_t CalcInterleaveByteOffset(const Tpl &t) 
    { 
    return 0; 
    } 
}; 

template<int Index, typename Tpl> 
size_t CalcInterleaveByteOffset(const Tpl &t) 
{ 
    return CalcInterlaveByteOffsetImpl<Index,Tpl>::CalcInterleaveByteOffset(t); 
} 
+0

tôi có thể phân biệt tầng lớp khác nhau với các thành viên biến khác nhau theo cách này? Tôi có thể đoán có? – GameDeveloper

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