使用标准库语义:
- 将一对迭代器传递给
foo
,而不是容器:它使您的函数更加通用
- 用于
std::iterator_traits<Iterator>::value_type
获取值类型
static_assert
迭代器的值类型为int
(或您想要的任何类型)
例子 :
#include <list>
#include <vector>
template<typename Iterator>
void foo(Iterator begin, Iterator end)
{
static_assert(std::is_same<int, typename std::iterator_traits<Iterator>::value_type>::value,
"Invalid value type : must be int");
}
int main() {
std::list<int> l1;
std::vector<int> v1;
foo(std::begin(l1), std::end(l1)); // OK
foo(std::begin(v1), std::end(v1)); // OK
std::vector<float> v2;
foo(std::begin(v2), std::end(v2)); // Doesn't compile
}
现场演示
笔记:
- 如果
foo
需要访问容器的特定成员函数(如 Deduplicator 所述,这可能是出于性能原因),那么您可能需要坚持使用以下Container
参数:
示例:(请注意获取 的区别value_type
,正如 MooingDuck 所指出的,这是使其与数组一起使用所必需的):
template <typename Container>
void foo(const Container& c)
{
static_assert(std::is_same<int, std::iterator_type<decltype(std::begin(c))>::value_type>::value, "Invalid value type : must be int");
// Use c member function(s)
}