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

STL container template parameter containing certain object

我有一个函数f:

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

这个函数应该采用 std::vector<int>std::initializer_list<int> 或任何其他 STL 容器,但前提是它包含 int.

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

我如何实现这一点?

可以使用模板模板参数:

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"); 
    //...
}

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

一种解决方案是检测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]);