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

时间:2013-05-26 05:29:58

标签: c++ templates visual-c++ gcc

我有一个在任何类型的STL容器上运行的函数,需要将容器的元素类型传递给另一个模板函数。实际上,当我说任何容器类型时,我并不是真的意思。严格只有矢量和数组。我有这样的事情:

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

MSVC11接受此代码但gcc不接受此代码。它出什么问题了?对于gcc,我还想过将值类型作为参数但是那时需要调用者指定T(容器类型),这对于std :: array来说非常笨重,而这个函数的主要目的是提供一个非常简单的接口它抽象出基础数据。

1 个答案:

答案 0 :(得分:7)

由于T::value_type是从属类型,因此您需要typename T::value_type

这不适用于数组 - 数组不会像value_type一样提供vector的typedef。

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

如果你真的必须使用容器(和支持数组),你可以使用std::begin(data)来获取数据开头的迭代器,然后使用std::iterator_traits<T>::value_type来获取value_type。