首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用“奇怪地重复出现的模板模式”的增量数字

使用“奇怪地重复出现的模板模式”的增量数字
EN

Stack Overflow用户
提问于 2011-04-07 01:29:56
回答 5查看 714关注 0票数 1

我想实现一个在创建时将其字段addr初始化为唯一值的class Address。每次创建Address实例时,该值都必须递增1。

让我们举个例子。在执行以下代码之后:

代码语言:javascript
运行
复制
Address x;
Address y;

x.addr应为1,而y.addr应为2。

为了实现这一点,我想到了Curiously Recurring Template Pattern。这可行吗?另外,有没有更简单的方法来实现同样的行为?

TIA,Jir

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-07 01:33:00

在这里您并不真正需要它,因为您不需要捕获对象的销毁。您会注意到,Wikipedia页面上的示例保存了该类型存在的对象的总数,因此CRTP有两个方便的特性:

  1. ,因为它是基类,所以它的析构函数被调用(成员也可以做到这一点)。
  2. 因为它是在派生类类型上模板化的,所以每个继承自它的类都有一个单独的计数器,如果它们使用多重继承,则包括层次结构中的不同类,每个类都包括自己的CRTP基,而不需要为每个类编写大量代码。

如果你只想让单个类的每个成员都有一个唯一的值,那么抛开线程安全不谈,你可以这样做:

代码语言:javascript
运行
复制
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放在模板基类中,如果你有很多类,这是一个很好的选择,因为使用它的每个类的类型更少:

代码语言:javascript
运行
复制
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> {
};
票数 7
EN

Stack Overflow用户

发布于 2011-04-07 01:33:48

对于你正在尝试做的事情来说,这似乎有点过头了。如果您只需要一个唯一的值,则使用静态整数,并在每次实例化对象时递增它。然后将每个实例(即非静态)变量设置为该值。

票数 1
EN

Stack Overflow用户

发布于 2011-04-07 01:35:11

当然,您可以完全按照您引用的维基百科文章中的说明进行操作。(除了它听起来不像是要递减dtor中的计数器。)或者,如果您只需要在Address类中使用它,那么您可以像CRTP实现那样一次性地执行以下操作:

代码语言:javascript
运行
复制
static int n_addresses = 0;
class Address {
  int addr;
  Address() { addr = ++n_addresses; }
};

或者类似的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5570514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档