gpt4 book ai didi

c++ - 我怎样才能安全地(轻松地)计算程序中某个类的*所有*实例?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:48 27 4
gpt4 key购买 nike

我希望能够实例化一个特定的(或者正常的)类(我可以修改它的源代码)并计算该类被实例化的次数(例如 like this )。但我想将所有实例都包括在我的总数中,甚至包括通过标准容器中的复制构造函数创建的一些实例。

让我的类的所有构造函数(包括复制构造函数)递增一个静态计数器是否合适?如果是这样,是否可以确保我的类仍然符合标准容器的要求(即 T(x) 等同于 x),例如通过覆盖其他运算符?

最佳答案

实现此目的的常见方法是使用您继承的类模板。

template <typename T>
class Countable
{
static unsigned cs_count_;
public:
Countable() { ++cs_count_; }
Countable( Countable const& ) { ++cs_count_; }
virtual ~Countable() { --cs_count_; }
static unsigned count() { return cs_count_; }
};

template <typename T>
unsigned Countable<T>::cs_count_ = 0;

所以要使用这个我会写:

class MyClass : public Countable<MyClass> { };

下面是一个线程安全的版本。它使用来自 boost 的类来确保递增、递减和读取操作在支持的平台上是原子的。

#include <boost/detail/atomic_count.hpp>

template <typename T>
class Countable
{
static boost::detail::atomic_count cs_count_;
protected:
~Countable() { --cs_count_; }
public:
Countable() { ++cs_count_; }
Countable( Countable const& ) { ++cs_count_; }
static unsigned count() { return cs_count_; }
};

template <typename T>
boost::detail::atomic_count Countable<T>::cs_count_(0);

关于c++ - 我怎样才能安全地(轻松地)计算程序中某个类的*所有*实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3277961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com