Sfinae应用于迭代器



我正在编写一个模板函数,该功能只能接受任何包含特定类型的容器的随机访问迭代器(由模板定义(。目前,我首先尝试使用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());

我无法解析您的enable_if。有效:

template<typename It, typename std::enable_if<std::is_same<typename std::iterator_traits<It>::iterator_category, std::random_access_iterator_tag>::value, int>::type = 0>
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;
}

但可能是我误解了您的意图。

您需要typename =使用匿名类型的Sfinae:

template<typename It,
         typename = 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;
}

或,您可以将std::enable_if<...>::type用作功能的返回类型。

如果您在C 17或更高版本中工作,请考虑研究概念的建议,该建议已进入C 20。

相关内容

  • 没有找到相关文章

最新更新