我想实现一个在创建时将其字段addr初始化为唯一值的class Address。每次创建Address实例时,该值都必须递增1。
让我们举个例子。在执行以下代码之后:
Address x;
Address y;x.addr应为1,而y.addr应为2。
为了实现这一点,我想到了Curiously Recurring Template Pattern。这可行吗?另外,有没有更简单的方法来实现同样的行为?
TIA,Jir
发布于 2011-04-07 01:33:00
在这里您并不真正需要它,因为您不需要捕获对象的销毁。您会注意到,Wikipedia页面上的示例保存了该类型存在的对象的总数,因此CRTP有两个方便的特性:
如果你只想让单个类的每个成员都有一个唯一的值,那么抛开线程安全不谈,你可以这样做:
int get_id() {
    static int counter = 0;
    return ++counter;
}
class Address {
    int addr;
  public:
    Address() : addr(get_id()) {}
};按照CRTP的例子,如果您有多个类要跟踪,并且希望每个类都有自己的ID空间,那么可以将get_id作为模板并使用Address作为参数。
对于这个用例,如果你使用了CRTP,你可以将数据成员addr放在模板基类中,如果你有很多类,这是一个很好的选择,因为使用它的每个类的类型更少:
template <typename Derived>
class unique_addr {
  protected:
    int addr;
    unique_addr() : addr(get_id<Derived>()) {}
};
class Address : public unique_addr<Address> {
};
class OtherAddress : public unique_addr<OtherAddress> {
};发布于 2011-04-07 01:33:48
对于你正在尝试做的事情来说,这似乎有点过头了。如果您只需要一个唯一的值,则使用静态整数,并在每次实例化对象时递增它。然后将每个实例(即非静态)变量设置为该值。
发布于 2011-04-07 01:35:11
当然,您可以完全按照您引用的维基百科文章中的说明进行操作。(除了它听起来不像是要递减dtor中的计数器。)或者,如果您只需要在Address类中使用它,那么您可以像CRTP实现那样一次性地执行以下操作:
static int n_addresses = 0;
class Address {
  int addr;
  Address() { addr = ++n_addresses; }
};或者类似的东西。
https://stackoverflow.com/questions/5570514
复制相似问题