繁体   English   中英

指向抽象模板单例类的指针的C ++向量?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM