ほとんどのメンバーに対してデフォルトの動作が必要で、1 つの (静的) メンバーに対してのみ特別な処理が必要な場合は、その特別な処理を独自のクラスにカプセル化し、そのクラスのメンバー変数を作成してみませんか? このような:
template<typename T>
class InstanceCounter
{
public:
static int Count;
// Automatically invoked when a class containing it is created.
InstanceCounter() { Count++; }
// Automatically invoked when a class containing it is destroyed.
~InstanceCounter() { Count--; }
// Automatically invoked when a class containing it is copy-constructed.
InstanceCounter(const InstanceCounter& rhs) { Count++; }
// No need to override operator=
// Allow this counter to be used as an int.
operator int() const { return Count; }
};
template<typename T>
int InstanceCounter<T>::Count;
class Foo
{
public:
InstanceCounter<Foo> count;
};
実装上の注意:
InstanceCounter
さまざまなクラスが独自のインスタンス数を簡単に持つことができるように、テンプレートを作成しました。
- C++11 の場合は、 の移動コンストラクターと移動代入演算子も提供する必要があります
InstanceCounter
。
別の方法として、CRTP イディオムを使用することをお勧めします。
template<typename T>
class InstanceCounted
{
public:
static int InstanceCount;
// Automatically invoked when a class containing it is created.
InstanceCounted() { InstanceCount++; }
// Automatically invoked when a class containing it is destroyed.
~InstanceCounted() { InstanceCount--; }
// Automatically invoked when a class containing it is copy-constructed.
InstanceCounted(const InstanceCounted& rhs) { InstanceCount++; }
// No need to override operator=
};
template<typename T>
int InstanceCounted<T>::InstanceCount;
class Foo : public InstanceCounted<Foo>
{
// insert class contents here
};
// Now we can access Foo::InstanceCount.