[英]C++ vector of pointers to abstract template singleton class?
如果这只是一团糟,并且有一种更好的方法可以使我感到震惊,但这就是我正在使用的方法。
我有一个基类Foo,所有派生类都是单例。 而是为每个派生函数编写实例函数,我想在Foo中对其进行模板化,因为它总是一样。
template<typename T>
class Foo{
private:
static T single;
public:
static T* instance();
virtual void fun() = 0;
};
template<typename T>
T Foo<T>::single;
template<typename T>
T* Foo<T>::instance(){
return &single;
}
class A : public Foo<A>{
public:
void fun();
};
class B...
class C...
当我尝试制作一个Bar类,该类将具有指向Foo类型的指针的向量时,就会发生麻烦。 它会被视为堆栈,并且会从Foo顶部运行代码,以及在推入或弹出时执行的代码。
class Bar{
private:
std::vector</*types of Foo<T>*/> fooStack;
public:
void init();
void updateFoo();
void pushFooStack(Foo* f);
void popFooStack();
};
#include "FooA.h"
void Bar::init(){
//Run Box initializing code
pushFooStack(A::instance())
return;
}
void Bar::updateFooStack(){
if(!fooStack.empty()){
//Run Foo<T> update code.
}
return;
}
void Bar::pushFooStack(Foo* f){
if(!fooStack.empty()){
//Run Foo<U> pause code
fooStack.pop_back();
}
fooStack.emplace_back(f);
//Run Foo<U> push code
return;
}
void Bar::popFooStack(){
if(!fooStack.empty()){
//Run Foo<T> pop code
fooStack.pop_back();
}
if(!fooStack.empty()){
//Run Foo<U> resume code
}
return;
}
我没有模板类的向量,并且我已经看到各种类似问题的建议,例如创建一些类IFoo或使用std :: unique_ptr或boost :: variant,但它们似乎都碰到了它本身的问题,通常是某种形式的“对Foo :: instance的未定义引用或“无效的模板参数” /“类型/值不匹配”。
如果有人知道我如何使它工作,或者也许只是一种更好的方法来完全设置整个事情,那么我很想听听它。 不必为每个Foo派生重写相同的实例函数,这很好,但是它至少可以工作,因此,如果使它正常工作本身就很麻烦,这也是一种选择。
预先感谢任何可以帮助我的人。
我不会为此使用单例模式。 假设我们要更新Bar对象中的Foos,我们可以让Foo从IFoo派生而没有模板。 如果您真的想确保它仅被实例化过一次,则可以在调用它时在其构造函数中设置一个静态布尔值,并在通过它运行时已声明的情况下断言或引发异常。
如果有充分的理由使用单例模式,则最可能要做的是拥有一个非模板接口,该模板类是从该接口派生而来的,然后将该接口存储在Bar数组中。
希望这可以帮助?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.