【问题标题】:C++ vector of pointers to abstract template singleton class?指向抽象模板单例类的指针的 C++ 向量?
【发布时间】:2019-08-21 22:06:26
【问题描述】:

如果这只是一团糟,并且有更好的方法来做这件事,我不会感到震惊,但这就是我正在使用的方法。

我有一个基类 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...

当我试图创建一个具有指向 Foo 类型的指针向量的类 Bar 时,问题就发生了。它将被视为一个堆栈,并会在顶部运行 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 的每个派生重写相同的实例函数会很好,但它至少可以工作,所以如果让它工作本身就是一个麻烦,这也是一种选择。

提前谢谢你,任何可以帮助我的人。

【问题讨论】:

  • 模板类可以有一个非模板基础。除此之外,你能解释一下你想通过一个指向单例的指针来实现什么吗?没有那个描述,这看起来像一个 XY 问题——你正在尝试实现 X,认为某些 Y 可能会提供 X 的解决方案,所以你问如何做 Y。如果你更有可能获得有用的选项问如何做 X(可能有许多可能的解决方案)而不是问如何做 Y(可能有也可能没有解决方案)。
  • 不得不说这个标题引起了人们的注意。 vector 指向单例的指针听起来很奇怪。为什么你会有不止一个单身人士?注意:您不能覆盖静态变量。 staticvirtual 不要混用。我在想像 CRTP 的东西,所以我去查了一下……voilà! 也就是说,这对工作的vector 部分没有帮助。
  • 强制提请注意Meyer's Singleton

标签: c++ singleton abstract-class stdvector template-classes


【解决方案1】:

我不会为此使用单例模式。假设我们要更新 Bar 对象中的 Foos,我们可以让 Foo 从 IFoo 派生但没有模板。如果你真的想确保它只被实例化一次,你可以在它的构造函数中有一个静态 bool,你在调用它时设置它并断言或抛出异常,如果它在运行时已经设置。

如果有充分的理由使用单例模式,您最可能想要做的是拥有一个模板类派生自的非模板接口,然后您将指向该接口的指针存储在 Bar 数组中。

希望这有帮助吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2023-01-23
    相关资源
    最近更新 更多