【发布时间】:2018-04-25 10:03:37
【问题描述】:
我正在编写一个模板函数,它应该只接受包含特定类型(由 template 定义)的任何容器的随机访问迭代器。 目前,我首先尝试使用 SFINAE 限制迭代器的类型,但代码无法编译。
#include <iostream>
#include <type_traits>
#include <vector>
template<typename It,
std::enable_if<
std::is_same<typename std::iterator_traits<It>::iterator_category,
std::random_access_iterator_tag>::value,
typename std::iterator_traits<It>::difference_type>>
void func(const It& begin, const It& end)
{
std::cout << begin[0] << std::endl;
}
int main()
{
std::vector<int> a = {0,1,2,3,4,5};
func(a.begin(), a.end());
return 0;
}
错误是:
error: ‘struct std::enable_if<std::is_same<typename
std::iterator_traits<_Iter>::iterator_category,std::random_access_iterator_tag::value,
typename std::iterator_traits<_Iterator>::difference_type>’ is not a
valid type for a template non-type parameter template<typename It,
std::enable_if<std::is_same<typename std::iterator_traits
error: no matching function for call to
‘func(std::vector<int>::iterator, std::vector<int>::iterator)’
func(a.begin(), a.end());
【问题讨论】:
-
仅供参考,您编写的
template<typename T, Z<...>>等价物无法编译,因为Z<...>不是非类型模板参数的有效类型