包含特定对象的STL容器模板参数

时间:2016-03-08 11:07:10

标签: c++ templates stl containers

我有一个函数f

template <typename T>
void f(T<int> ints)
{ /* */ }

此函数应该使用std::vector<int>std::initializer_list<int>或任何其他STL容器,但仅限于int

我可以接受其他class es int作为模板参数,但我不希望它接受std::vector<char>std::vector<double>std::list<double>或类似的东西。

我怎么能意识到这一点?

2 个答案:

答案 0 :(得分:5)

可以使用模板模板参数:

template <template <typename...> typename T>
void f(const T<int>& ints)
{ /* */ }

但我建议改用容器的value_type类型成员。这样可以避免将其他模板与int作为模板参数进行匹配。

//using std::enable_if_t
template <typename T>
std::enable_if_t<std::is_same<typename T::value_type, int>::value> 
f(const T& ints)
{ /* */ }

//or static_assert
template <typename T>
void f(const T& ints) { 
    static_assert(std::is_same<typename T::value_type, int>::value,
                  "T must be a container of ints"); 
    //...
}

答案 1 :(得分:1)

迂腐地说,这是一个从中实例化函数的函数模板。

一种解决方案是检测标准容器提供的value_type

template<class T>
typename std::enable_if<std::is_same<int, typename T::value_type>::value>::type
void f(T const& ints);

但这不适用于内置数组,因为它们没有嵌入式value_type。对于内置数组,您可以添加重载:

template<size_t N>
void f(int const(&ints)[N]);