包含特定对象的 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
作为模板参数接受其他 class
es,但我不希望它接受 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]);
我有一个函数f
:
template <typename T>
void f(T<int> ints)
{ /* */ }
这个函数应该采用 std::vector<int>
或 std::initializer_list<int>
或任何其他 STL 容器,但前提是它包含 int
.
我可以接受它以 int
作为模板参数接受其他 class
es,但我不希望它接受 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]);