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++
và 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
^
Bạn đã nghe nói về ['TypeList'] (http://loki-lib.sourceforge.net/html/a00681.html) chưa? –
@RSahu Không, tôi đã không làm vậy. –
... Nhưng '' template <> class TupleLite {} '' là hợp lệ C++ 11? – Cinch