C ++结构与向量中的模板

时间:2013-12-18 13:50:42

标签: c++ arrays templates struct

我正在用C ++制作文字冒险游戏。这是该游戏中对象的结构(用户可以拾取并放入库存中)

template <int N>
struct Object
{
    static const int length = N;
    string names[N];
    string description;
};

对象示例:

Object<2> flower = { {"flower", "the flower"}, "A strange looking flower"};
Object<3> book = { { "the book", "book", "recipe book" }, "The world's finest cocktail recipes now all in one easy to use companion." };

多个名称是命令解析器的同义词,因此用户可以输入“拾取书籍”或“拾取食谱书”,在这两种情况下都会选择对象书。

现在我想创建一个矢量清单来存储清单中的所有元素。

vector<Object> inventory;

现在,当然,这给了我一个编译器错误,因为它需要这样的东西:

vector<Object<5>> inventory;

但是,有些对象的名字比其他对象多,有可能这样,如果有的话,怎么样?

vector<Object<N>> inventory;

3 个答案:

答案 0 :(得分:11)

所有不同的Object<N>类都是不同类型,大小不同。您不能将它们放在同质容器中。

你需要一些基类或基接口,并在向量中存储指针,当你拉出元素时依赖于虚拟调度和多态。这会使Object的容器成为异构容器。

或者,最好删除模板并将名称存储在成员容器中:

struct Object
{
    set<string> names;
    string description;
};

vector<Object> easy;

PS。我不认为Object任何类的好名字。 CompuChip InventoryItem的建议更有意义。

答案 1 :(得分:0)

vector需要知道它包含的对象的大小,所以很明显它不允许在sizeof(Object<N+X>) > sizeof(Object<N>))内部改变模板实例。

从主Object结构中删除模板化数组,并将其替换为常见的vectorliststring对象,然后解决您的问题。< / p>

答案 2 :(得分:0)

从BaseObject派生对象,并形成一个指向BaseObject的智能指针向量:

struct BaseObject
{
   virtual ~BaseObject() = default;
};

template<int N>
  struct Object : public BaseObject
{
   static const int length = N;
   string names[N];
   string description;
};

typedef shared_ptr<BaseObject> Objptr;
vector<Objptr> Inventory(1006);