c++;用于生成未知类实例列表的模板 我有一个情况,我试图写一些C++代码来实现,我想我需要使用模板,但我不确定。我认为我对模板理解不够,只是想知道我是否走上了正确的道路。我以前从未实现过需要模板的类

c++;用于生成未知类实例列表的模板 我有一个情况,我试图写一些C++代码来实现,我想我需要使用模板,但我不确定。我认为我对模板理解不够,只是想知道我是否走上了正确的道路。我以前从未实现过需要模板的类,c++,templates,C++,Templates,我有一个基类,它需要实例化一个新类,并将其存储在一个列表中以供将来访问。需要实例化的类派生自具有一个虚拟方法的基类。实例化类后,将调用此方法,并将新实例存储在列表中。提供了另一种方法来获取实例化对象 假设虚拟类名为foo: class foo { public: virtual void process() = 0; } 用户将创建一个类栏: class bar : public foo { public: void process() {}; } 我认为需

我有一个基类,它需要实例化一个新类,并将其存储在一个列表中以供将来访问。需要实例化的类派生自具有一个虚拟方法的基类。实例化类后,将调用此方法,并将新实例存储在列表中。提供了另一种方法来获取实例化对象

假设虚拟类名为foo:

class foo 
{
    public:
    virtual void process() = 0;
}
用户将创建一个类栏:

class bar : public foo
{
    public:
    void process() {};
}
我认为需要作为模板类的类:

class Filter<Foo* T>
{
public:
    // use value junk to derive foo
    // and put the new instance on a std::list
    add(Junk* junk);
    T get();

private:
    std::list<T> mFooList;
}

void Filter::add(Junk* junk)
{
    T* foo = new T();
    foo.p(junk);
    mFooList.push_back(foo);
}

T* Filter::get()
{
    if(!mFoolist.empty())
    {
        T* res = mFooList.back();
        mFooList.pop_back();
        return res;
    }
    return nullptr;
}
类过滤器
{
公众:
//使用价值垃圾来派生foo
//并将新实例放在std::列表中
添加(垃圾*垃圾);
T get();
私人:
std::列表mFooList;
}
空过滤器::添加(垃圾*垃圾)
{
T*foo=新的T();
副食品(垃圾);;
mFooList.push_back(foo);
}
T*Filter::get()
{
如果(!mFoolist.empty())
{
T*res=mFooList.back();
mFooList.pop_back();
返回res;
}
返回空ptr;
}

在这种情况下,您不需要使用模板。在C++中,派生类可以被分配给基类的指针。你可以使用foo指针

class foo
{
    public:
    virtual void process();
};

class bar1: public foo
{
     public:
     void process();
};

class bar2 : public foo
{         
    public:
     void process();
};

class filter
{
     private:
     std::list<foo*> _foos;

     public:
     foo* get();
     void add(foo* f); 
};

void filter::add(foo* f)
{
    _foos.push_back(f);
}

foo* filter::get()
{
    if(!_foos.empty())
    {
         return _foos.pop_back();
     }
    return nullptr;
}

你这里有几个问题<代码>类筛选器不是声明模板的方法。并且
void Filter::add(Junk*Junk)
不以任何方式使用
Junk
,那么它应该如何影响存储值呢?还有,
mFooList.pop_back()
是一个
void
函数,因此实际上不返回任何内容。我只是省略了关于如何使用垃圾作为fir滤波器系数的细节。我只是觉得这会给问题增加不必要的复杂性。所以让我更清楚地理解你的语法-你想让
T
成为从
Foo
派生的类型,作为模板参数传递给
Filter
类,还是我过度解释了你的代码?就像我说的,我不知道我理解这一点。用户将定义一个从foo派生的类,将其称为bar并将其告知filter类。然后,当新数据进入时,过滤器将处理传入的数据并创建类栏的实例。用户可以通过get方法获得筛选结果。当用户调用add时,参数是一个不同的类,该类在定义类筛选器时已知。它是输入类。我希望能够允许用户通过指定一个类来更改过滤器的实现,该类将以他们想要的方式处理输入。。注意
void
返回类型。注意下划线前缀。
filter fil;
fil.add(new foo());
fill.add(new bar1());
fill.add(new bar2());

foo f = fill.get();
while(f != nullptr)
{
    f->process();
    delete f;
    f = fil.get();
}