使用"Curiously Recurring Template Pattern"的增量数字
Incremental number using the "Curiously Recurring Template Pattern"
我想实现一个class Address
,当创建时,将其字段addr
初始化为唯一的值。每次创建Address
实例时,该值必须增加1。
让我们举个例子。在执行了以下代码之后:
Address x;
Address y;
x.addr
为1,y.addr
为2。
为了实现这一点,我想到了奇怪的循环模板模式。这可行吗?此外,是否有更简单的方法来实现相同的行为?
TIA,Jir
这里并不需要它,因为您不需要捕获对象的销毁。您会注意到,Wikipedia页面上的示例保存了该类型对象的总数,因此CRTP有两个方便的特性:
- 因为它是基类,所以调用它的析构函数(成员也可以实现这一点)。
- 因为它是在派生类类型上模板化的,所以每个从它继承的类都有一个单独的计数器,包括层次结构中的不同类,如果它们使用多重继承来每个类都包含自己的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> {
};
对于你想做的事情来说,这似乎有点小题大做了。如果您只需要一个惟一的值,请使用一个静态整数,并在每次实例化对象时增加它。然后将每个实例(即非静态)变量设置为该值。
当然,您可以完全按照您引用的Wikipedia文章中所示的方法进行操作。(除了它听起来不像是你想要减少dr中的计数器。)或者,如果您只需要Address
类使用它,那么您可以一次性执行那里的CRTP实现所做的事情:
static int n_addresses = 0;
class Address {
int addr;
Address() { addr = ++n_addresses; }
};
public class Address
{
private static int addrCounter = 1;
public int addr { get; private set; }
public Address()
{
addr = addrCounter++;
}
}
你也可以在类内部使用静态计数器:
class Address
{
static int s_Count; // define this variable in appropriate cpp file
int addr;
public:
Address () : addr(++ s_Count) {}
};
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 表示"accepting anything for this template argument" C++概念的通配符
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 传递给std::function template的template参数究竟代表什么
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 使用"Curiously Recurring Template Pattern"的增量数字