std::vector
sử dụng đống. Geez, thật là lãng phí nếu chỉ để const
kiểm tra sự tỉnh táo. Vấn đề std::vector
là tăng trưởng năng động tại thời điểm chạy, không phải bất kỳ kiểm tra cú pháp cũ nào nên được thực hiện tại thời điểm biên dịch. Nếu bạn không phát triển thì hãy tạo một lớp để bọc một mảng bình thường.
#include <stdio.h>
template <class Type, size_t MaxLength>
class ConstFixedSizeArrayFiller {
private:
size_t length;
public:
ConstFixedSizeArrayFiller() : length(0) {
}
virtual ~ConstFixedSizeArrayFiller() {
}
virtual void Fill(Type *array) = 0;
protected:
void add_element(Type *array, const Type & element)
{
if(length >= MaxLength) {
throw 0;
}
array[length] = element;
length++;
}
};
template <class Type, size_t Length>
class ConstFixedSizeArray {
private:
Type array[Length];
public:
explicit ConstFixedSizeArray(
ConstFixedSizeArrayFiller<Type, Length> & filler
) {
filler.Fill(array);
}
const Type *Array() const {
return array;
}
size_t ArrayLength() const {
return Length;
}
};
class a {
private:
class b_filler : public ConstFixedSizeArrayFiller<int, 2> {
public:
virtual ~b_filler() {
}
virtual void Fill(int *array) {
add_element(array, 87);
add_element(array, 96);
}
};
const ConstFixedSizeArray<int, 2> b;
public:
a(void) : b(b_filler()) {
}
void print_items() {
size_t i;
for(i = 0; i < b.ArrayLength(); i++)
{
printf("%d\n", b.Array()[i]);
}
}
};
int main()
{
a x;
x.print_items();
return 0;
}
ConstFixedSizeArrayFiller
và ConstFixedSizeArray
có thể tái sử dụng.
Đầu tiên cho phép kiểm tra giới hạn thời gian chạy trong khi khởi tạo mảng (giống như vectơ có thể), sau này có thể trở thành const
sau khi khởi tạo này.
Thứ hai cho phép mảng được phân bổ bên trong một đối tượng khác, có thể nằm trên heap hoặc đơn giản là ngăn xếp nếu đó là vị trí của đối tượng. Không lãng phí thời gian để phân bổ từ đống. Nó cũng thực hiện kiểm tra const thời gian biên dịch trên mảng.
b_filler
là một lớp private nhỏ để cung cấp các giá trị khởi tạo. Kích thước của mảng được kiểm tra tại thời điểm biên dịch với các đối số mẫu, vì vậy không có cơ hội vượt quá giới hạn.
Tôi chắc rằng có nhiều cách kỳ lạ hơn để sửa đổi điều này. Đây là một cú đâm ban đầu. Tôi nghĩ rằng bạn có thể bù đắp cho bất kỳ thiếu sót nào của trình biên dịch với các lớp.