接受任何类型的STL容器并使用其值类型

Accepting any type of STL container and using its value type

本文关键字:类型 任何 STL      更新时间:2023-10-16

我有一个函数,它对任意类型的STL容器进行操作,并且需要将容器的元素类型传递给另一个模板函数。实际上,当我说任何容器类型时,我并不是指它。严格来说只有向量和数组。像这样:

template <typename T> int ProcessData(T data)
{
  return DoInternalProcessing<T::value_type>(data.data(), data.size());
}

MSVC11接受此代码,但gcc不接受。有什么问题吗?对于gcc,我也考虑过将值类型作为参数,但这将要求调用者指定T(容器类型),这对于std::array来说是非常笨拙的,这个函数的主要目的是提供一个非常简单的接口,从底层数据中抽象出来。

由于T::value_type是依赖类型,因此需要typename T::value_type

这对数组不起作用——数组不会像vector那样提供value_type的类型定义。

通常的处理方法是接受一对迭代器(或指针,如果底层的"集合"是数组)。在这种情况下,可以使用std::iterator_traits<T>::value_type来获取迭代器所指向的值类型。这将适用于原始指针,因此(例如)std::iterator_traits<int *>::value_type将生成int

如果您确实必须使用容器(并支持数组),则可以使用std::begin(data)获取数据开头的迭代器,然后在其上使用std::iterator_traits<T>::value_type获取value_type。