【发布时间】:2014-01-12 01:49:59
【问题描述】:
我对模板以及编译器如何处理它们有点迷茫。
需要一些通用的 std::vector 包装器>* lpVars;当我删除 lpVars 时,它能够对该向量中包含的所有项目执行删除。类似于 C# 的 List (通用列表类)。 所以我去找模板写了这样的东西:
template<class T>
class ListPtr
{
public:
std::vector<T*> items;
ListPtr()
{ }
~ListPtr()
{
size_t count = items.size();
for(size_t i=0; i<count; i++)
{
T* item = items[i];
delete item;
}
items.clear();
}
inline const int count() const
{
return (int)items.size();
}
inline T* operator[](size_t index) const
{
return items[index];
}
inline void Add(T* item)
{
items.push_back(item);
}
};
后来我声明了全局类型列表,例如:
class SomeType1List : public ListPtr<SomeType1> {};
class SomeType2List : public ListPtr<SomeType2> {};
...
class SomeTypeNList : public ListPtr<SomeTypeN> {};
这是我对主题感兴趣的第一部分:
(1) 这些类 SomeType1List、SomeType1List、...、SomeTypeNList 是否已完全预处理为模板代码,每个声明(SomeType1、SomeType2、...、SomeTypeN)都替换为 T 模板类型,例如没有模板(完全声明的类),或者编译器在这里执行了一些其他的魔法?
(2) 如果编译器执行了其他一些魔法,我应该如何定义编译器将编译它们的这些类型,因为它们是完全声明的类?
更准确地解释上述代码的用法:
这个列表实例被初始化,并从如下函数返回:
SomeType1List* GetItems()
{
SomeType1List* items = new SomeType1List();
for(int i=0; i<1000; i++)
{
SomeType1* item = new SomeType1();
// feed item with some data
items->Add(item);
}
return items;
}
并在代码的其他部分使用如下:
SomeType1List* items = GetItems();
int count = items->count();
for(int i=0; i<count; i++)
{
SomeType1* item = items[i];
// do something with item;
}
delete items; // all memory occupied by items released after this line
我对主题的第二部分兴趣:
(3) 仅使用标准类(不使用 boost 或类似的 sdks)可以以不同的方式编写吗?目标是速度,但要保持代码简洁易读。所以这个问题是有没有更好的方法来做这一切?
【问题讨论】:
-
@Dietmar Kühl:谢谢,这是错字;)
标签: c++ list templates pointers