2015-03-27 12 views
5

Tôi đã cân nhắc việc triển khai thực hiện std::tuple (và bất kỳ lớp mẫu tương tự nào với số lượng thành viên được xác định tại thời gian biên dịch). người ta có thể tạo ra một "kiểu đệ quy" giống như một danh sách liên kết. Tôi đã cố gắng biên soạn các bài kiểm tra hợp cụ thể sau đây:Tạo một danh sách liên kết tuple với các mẫu variadic

template <typename FirstType, typename... OtherTypes> 
class TupleLite 
{ 
    public: 
    FirstType type_; 
    TupleLite<OtherTypes...> other_types_; 
}; 

int main() 
{ 
    TupleLite<int,double> mytuple; 
} 

Lớp tự biên dịch mà không có lỗi, nhưng instantiation ném lỗi wrong number of template arguments (0, should be 1 or more). Tôi tin rằng điều này là do TupleLite<int, double> cố gắng khởi tạo TupleLite<double>, cố gắng khởi tạo TupleLite<>, mà không có định nghĩa hợp lệ.

"Lớp học có kích thước đệ quy" này có thể được tận dụng không? Tôi đã cố gắng xác định "không có đối số chuyên môn" của TupleLite như sau:

template <> 
class TupleLite {} 

.... nhưng điều đó dường như không làm việc, mặc dù g++clang++ dường như không đồng ý vào chính xác lý do tại sao.

Từ g++, các lỗi liên quan nhất dường như là:

error: template specifiers not specified in declaration of ‘template<class FirstType, class ... OtherTypes> class TupleLite’ 
    class TupleLite 
     ^
error: wrong number of template arguments (0, should be 1 or more) 
TupleLite<OtherTypes...> other_types_; 
         ^

clang++, tuy nhiên, nói:

error: extraneous 'template<>' in declaration of class 'TupleLite' 
template <> 
^ 
error: redefinition of 'TupleLite' as different kind of symbol 
class TupleLite 
    ^
+1

Bạn đã nghe nói về ['TypeList'] (http://loki-lib.sourceforge.net/html/a00681.html) chưa? –

+0

@RSahu Không, tôi đã không làm vậy. –

+0

... Nhưng '' template <> class TupleLite {} '' là hợp lệ C++ 11? – Cinch

Trả lời

3

Định nghĩa mẫu chính của TupleLite xác định rằng nó đòi hỏi ít nhất một mẫu đối số , FirstType. Kể từ đó không phải những gì bạn muốn bày tỏ là, cung cấp một mẫu defition chính mà kết thúc cũng xử lý các trường hợp có sản phẩm nào như thế này:

template <typename...> 
class TupleLite{}; 

Và một chuyên ngành phần:

template <typename FirstType, typename... OtherTypes> 
class TupleLite<FirstType, OtherTypes...> 
{ 
    public: 
    FirstType type_; 
    TupleLite<OtherTypes...> other_types_; 
}; 

Coliru Demo.

CHỈNH SỬA: Cảm ơn Nikos vì đã chỉ ra rằng thông số trống không cần thiết trong trường hợp này.

+1

Bạn không cần chuyên môn hóa rỗng. Chỉ cần xác định mẫu cơ sở: [demo] (http://coliru.stacked-crooked.com/a/db65288a2503dfa8) –

+0

@NikosAthanasiou Ah yes. Cảm ơn! Đã chỉnh sửa. – Pradhan

+0

Ah, điều đó khá có ý nghĩa. Cảm ơn bạn. –

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