我希望有一个可以通过其默认构造函数构造的Allocator类,因为许多STL容器会尝试创建这样的分配器。
但是,我也希望分配者分享某些共同资源。
我目前的解决方案是拥有一个全局变量,表示各个对象在初始化时抓取的共享状态。例如,我做了这样的事情:
const int start = 0;
template<class T>
class Counter() {
public:
Counter() : x_(start) {}
int increment() {
return x_++;
}
private:
int x_;
};
void SetStart(int s) {
start = s;
}
有没有办法在这种设置中使用全局变量?我认为有可能创建某种类型的管理器类型,其子类型的构造函数访问适当的资源,但由于内部类不能访问C ++中外部类的成员变量,我不确定这是怎么回事工作
答案 0 :(得分:3)
基本上,使用CRTP,您可以跟踪基类中的计数,并使用template template
参数来维护使用类模板作为派生类型的能力。
template <template <typename> class T>
class counter
{
public:
counter() { ++count; }
protected:
static int count;
};
template <template <typename> class T> int counter<T>::count(0);
template <typename T>
class X : counter<X>
{
public:
X() : x_(count) {}
private:
int x_;
};
...
X<int> x; // x_ initialized to 1
X<int> x2; // x_ initialized to 2
答案 1 :(得分:0)
那么为什么不定义一个&#34; 分配器&#34; 1 课程,如果你需要它?
template<typename T> class someTemplatedClass;
class myAllocator{
template<typename T> friend class someTemplatedClass;
static unsigned int someNumber;
};
unsigned int myAllocator::someNumber = 0;
然后你可以在课堂上使用它:
template<typename T>
class someTemplatedClass{
int someVariable;
public:
void write(){cout<<someVariable<<endl;};
someTemplatedClass(){someVariable = myAllocator::someNumber++;};
};
计数器将持续通过所有专业化(因为它本身不是模板化的)。计数器在类范围之外也是不可见的,因为someNumber
实际上是private
。您也可以为了用户友好性而使myAllocator
成为单身。
或者,如果你需要它 - 你可以定义一个static void set(const int value)
setter函数,它可以让你设置实例计数器的起始编号。
someTemplatedClass<int> array[10];
for(unsigned int i=0;i<10;i++)
array[i].write();
someTemplatedClass<float> array2[5];
for(unsigned int i=0;i<5;i++)
array2[i].write();
应打印从0
到14
的数字,因此总计算所有 someTemplatedClass
的实例。< / p>
1 这个例子甚至没有在分配器类附近,但你提到它,所以也许计数器只是一个例子而且它真的最终成为一个分配器。