1
template <class ContainerType, class elementType>
void SerializeContainer (    ContainerType< elementType > container )
{
}

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

下面不会编译..有什么办法可以解决这个问题吗?

4

1 回答 1

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;

There simply isn't a one-size-fit-all solution (before C++11) if you want the ElementType spelled explicitly when matching. It's better to stick with the traits provided by the container.

于 2012-10-30T19:12:55.370 回答