每次创建对象时,我都会将该对象的指针存储在向量中,该向量是对象类的静态成员,以便监视其状态,如下所示:
class A {
private:
static std::vector<A *> as;
STATE state = NONE; //<- enum
void doSomething();
public:
A() {
as.push_back(this);
}
static void monitor() {
auto end = as.end();
for (auto obj = as.begin(); obj != end; obj++) {
switch ((*obj)->state) {
//process it
(*obj)->doSomething();
}
}
}
}
//// recurrent call in other part of the program or even in other thread
A::monitor();
上面的代码显然是不完整的,缺少适当的析构函数,删除了正被删除的向量的指针。
现在的问题是我必须对模板类
做同样的事情template <typename T>
class A {
void doSomething(); //<--independent, no template
....
}
有没有办法做同样的事情?,为每个对象应用独立类型方法“doSomething()”?
如果函数“doSomething()”是依赖类型,那么有一种方法可以实现相同的目的吗?
答案 0 :(得分:4)
您也可以这样做:
template <typename T>
class A {
private:
static std::vector<A<T>*> as;
STATE state = NONE; //<- enum
void doSomething()
public:
A() { as.push_back(this); }
static void monitor() {
auto end = as.end();
for (auto obj = as.begin(); obj != end; obj++) {
switch ((*obj)->state) {
//process it
(*obj)->doSomething();
}
}
}
}
template <typename T>
std::vector<A<T>*> as;
你只需要打电话
A<MyType>::monitor();