struct Delete
{
template <typename T>
void operator() (T* t)
{
delete t;
}
};
template <typename Container>
class SmartContainer
: public Container
{
public:
~SmartContainer()
{
std::for_each(Container::begin(), Container::end(), Delete());
}
SmartContainer(const SmartContainer& other)
{
for (typename Container::const_iterator iter = other.begin(); iter != other.end(); ++iter) {
push_back(new typename Container::value_type(**iter));
}
}
SmartContainer() {}
};
在此代码中,我尝试实现一个智能容器。容器包含指针。当被销毁时,它会删除指针。问题在于编写复制构造函数。它应该复制对象并将副本指针放入容器中。我在此push_back
行中遇到错误,因为Container::value_type
是指针类型,但是它需要创建一个反射类型的对象。std::remove_pointer
在这里可能很有用,但是我的编译器不支持C 11。也许带有智能指针的普通容器是一个更好的选择,但我需要解决方案。
您可以实现自己的remove_pointer
(来自cppreference.com):
template< class T > struct remove_pointer {typedef T type;};
template< class T > struct remove_pointer<T*> {typedef T type;};
template< class T > struct remove_pointer<T* const> {typedef T type;};
template< class T > struct remove_pointer<T* volatile> {typedef T type;};
template< class T > struct remove_pointer<T* const volatile> {typedef T type;};
然后做typename remove_pointer<Container::value_type>::type
。
更改模板参数。而不是Container
使其Container<T*>
,然后您将拥有可用的基本对象类型。
template <typename Container, typename T>
class SmartContainer
: public Container<T*>