template <class ContainerType, class elementType>
void SerializeContainer ( ContainerType< elementType > container )
{
}
//call like this
std::vector<int> vector;
SerializeContainer(vector);
下面不会编译..有什么办法可以解决这个问题吗?
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.