使用不带参数

时间:2018-04-27 14:44:44

标签: c++ templates polymorphism

我正在尝试为一个项目实现一个产生系统,其中我有一个容器类(在这种情况下它本质上是世界),它可以容纳任何世界对象,其中有几个派生类。

因为容器类具有与派生类的实例化相关的信息(调用spawn方法的外部类不需要),我认为使用模板化成员函数是有意义的,其中函数的类型是被要求被指定为

containerClass.functionName<type>(/*no arguments specifying the type*/);

没有模板化容器类(因为该类包含多种类型的对象)

这可能是我的误解,但是不能从括号之间的值(或者这些&lt;&gt;通常所知的)中获取哪种类型的信息?

以下(简化)代码是我对模板的理解所实现的这个任务:

#include <vector>
#include <iostream>

class baseClass {
    public:
        virtual const char* getName() { return "baseClass"; }
};

class derivedA : public baseClass {
    public:
        const char* getName() { return "derivedA"; }
};

class derivedB : public baseClass {
    public:
        const char* getName() { return "derivedB"; }
};

class container {
    public:
        container() {}
        ~container() {
            for (int i = 0; i < contained.size(); ++i) {
                delete contained[i];
            }
        }
        template <typename type> void spawn() {
            contained.push_back(new type(/*in my case the container  has data with which to initialize the class*/));
        }
        void printNames() {
            for (int i = 0; i < contained.size(); ++i)
                std::cout << contained[i]->getName() << std::endl;
        }

    private:
        std::vector<baseClass*> contained;
};


int main() {
    container c;

    c.spawn<derivedA>();
    c.spawn<derivedB>();
    c.spawn<derivedA>();

    c.printNames();

    return 0;
}

这可以按预期工作(给出原始问题的修改)生成

derivedA
derivedB
derivedA

虽然我还没有在我的实际项目中使用它(这给了我一个链接器错误,说明特定的模板方法不存在),我想知道这是否是有效的C ++和/或一个好的做法。是否有更明智的方法来实现这个目标?

我非常感谢有人解释如何最好地实现这样的功能,最好不要传递未使用的实例。

在较不专业的说明中(我相信一些用户会编辑出来......)我为这个问题的长度道歉。出于同样的原因,我想这可能是一个重复的帖子,我不知道哪个术语可以最好地解释我的情况。如果你以某种方式完成了这一切,我感谢你的耐心!

0 个答案:

没有答案