シンプルなネイティブ C++ 固定容量配列テンプレート クラスを実装して、範囲ベースの "for each" 構文を便利にサポートし、オーバーヘッドを最小限に抑えたいと考えています。
const インスタンスでのサポートに問題があります。
この実装では:
template< class T, size_t Capacity >
class List
{
public:
List() { mSize = 0; }
const T* begin() const { return mItems; }
const T* end() const { return mItems + mSize; }
T* begin() { return mItems; }
T* end() { return mItems + mSize; }
private:
size_t mSize;
T mItems[ Capacity ];
};
そしてこの使用法:
const List< int, 5 > myInts;
for each( const int myInt in myInts )
{
continue;
}
次のエラーが表示されます。
error C2440: 'initializing' : cannot convert from 'const int *' to 'int *'
Conversion loses qualifiers
この使用法は文句を言いません:
List< int, 5 > myInts;
for each( const int myInt in myInts )
{
continue;
}
そして、この(望ましくない)実装は文句を言いません:
template< class T, size_t Capacity >
class List
{
public:
List() { mSize = 0; }
T* begin() const { return const_cast< List* >( this )->mItems; }
T* end() const { return const_cast< List* >( this )->mItems + mSize; }
private:
size_t mSize;
T mItems[ Capacity ];
};
私が理解していないフードの下で何が起こっているのですか? これを適切に処理する std::vector<> についてはどうですか? ありがとう!