このおもちゃのコードのような、テンプレート化されたコンテナー クラスがあります。
template <class ItemType> class MyVector
{
public:
MyVector() : _numItems(0), _items(NULL) {/* empty */}
/** Returns a reference to the first item in our array,
* or a default-constructed item if the array is empty.
*/
const ItemType & GetFirstItemWithDefault() const
{
return (_numItems > 0) ? _items[0] : _defaultItem;
}
[other methods omitted because they aren't relevant]
private:
int _numItems; // how many valid items (_items) points to
ItemType * _items; // demand-allocated
const ItemType _defaultItem;
};
このクラスは非常に便利に使用できます。どのコードでも "MyVector.h" を #include するだけで、MyVector や MyVector などのオブジェクトの宣言を開始できます。
ただし、気になる点の 1 つは、_defaultItem メンバー変数の存在です。これは、コンテナーが空のときに GetFirstItemWithDefault() に有効な参照を返す機能を与えるためだけに存在します。反対意見は、N 個の MyVector オブジェクトを宣言すると、RAM にも _defaultItem の N 個のコピーが存在することを意味するということです。ただし、それらはすべて同一で読み取り専用であるため、実際には 1 つにつき 1 つだけ存在する必要があります。 MyVector ごとに 1 つではありません。
したがって、明らかな解決策は _defaultItem を static にすることです....しかし、AFAICT にはコストが伴います。これを行うと、古いコードを単純に #include "MyVector.h" して実行することはできなくなります。 .. ユーザーは、自分の .cpp ファイルの 1 つで、その静的変数のストレージを確実に宣言する必要があります。これは、(a) お尻の痛みであり、(b) コードのユーザーが認識しなければならないことを意味します。クラスの内部実装の詳細。_defaultItem はプライベート メンバー変数であるため、クラスのユーザーはそれについて考える必要はなく、その存在に気付く必要さえありません。ましてや、そのためのストレージを宣言する必要があることを知る必要はありません。(そして、2 つの別々のコードが両方ともそのストレージを宣言し、お互いが同じことをしたことを認識していない場合はどうなるでしょうか? 重複シンボル リンカー エラーが発生するのではないでしょうか?)
したがって、私の質問は次のとおりです。MyVector のユーザーがそれについて知る必要がないように、この静的メンバー変数に (インスタンス化された MyVector の型ごとに) 1 つの一意のストレージを自動的に提供するように C++ に指示する方法はありますか? (いくつかの一般的なケースだけでなく、 MyVector<...> のすべての可能なインスタンス化に対して自動である必要があることに注意してください)