2012-10-30 27 views
1
template <class ContainerType, class elementType> 
void SerializeContainer ( ContainerType<elementType> container) 
{ 
} 

//call like this 
std::vector<int> vector; 
SerializeContainer(vector); 

下面不会编译..有什么办法可以通过这个吗?有什么办法可以制作带模板的容器模板?

+0

_如何不编译?你可以编辑你的问题,包括错误(请完成未经编辑的请)。 –

回答

5

它更容易使用容器value_type成员提取元素类型:

template <typename T> 
    void SerializeContainer (const T& container) 
    { 
     typedef typename T::value_type ElementType; 
     .......... 
    } 

之所以你的代码不工作是因为语法ContainerType<ElementType>只有当ContainerType是一个工作真的是模板。 C++支持模板,模板参数如下:

template <template <typename> class ContainerType, typename ElementType> 
void serializeContainer(const ContainerType<ElementType>& container) { 
} 

但即使是这样,匹配标准C++容器,因为有一些隐藏的默认参数。当明确写出:

std::vector<int, 
      std::allocate<int> > vector; 

所以你需要做的ContainerType参数接受2个参数:

template <typename <typename, typename> C, typename E, typename A> 
void serializeContainer(const C<E, A>& container) { 
} 

但那么这将不会匹配set::set,因为它有不同数量的模板参数:

std::set<int, 
     std::less<int>, 
     std::allocator<int> > set; 

目前根本没有一个尺寸合适的解决办法(前C++ 11)如果你想匹配时的ElementType拼写明确。坚持容器提供的特性会更好。

+0

正是我想要的!谢谢! –

相关问题