gpt4 book ai didi

c++ - 使用 "Curiously Recurring Template Pattern"的增量数

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:58 26 4
gpt4 key购买 nike

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

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

Address x;
Address y;

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

为了做到这一点,我想到了 Curiously Recurring Template Pattern .可行吗?另外,是否有更简单的方法来实现相同的行为?

TIA,吉尔

最佳答案

在这里你真的不需要它,因为你不需要捕获对象的破坏。您会注意到该维基百科页面上的示例保留了该类型存在的对象总数,因此 CRTP 具有两个方便的功能:

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

如果您只想为单个类的每个成员提供唯一值,那么除了线程安全之外,您可以这样做:

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> {
};

关于c++ - 使用 "Curiously Recurring Template Pattern"的增量数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5570514/

26 4 0