C ++任何具有特定值类型的迭代器?

时间:2017-10-18 01:16:58

标签: c++ templates iterator

假设我有一个函数模板来遍历某个容器的任何迭代器:

template<class iter_type>
void f(iter_type start, iter_type finish)
{
   // loop from start to finish
}

现在问题是我知道该容器的value_type(并且f()仅对该特定value_type有意义。有没有办法限制iter_type拥有特定的value_type

我可以继承std::iterator,但f()只是一小段代码,不值得专门的课程。

2 个答案:

答案 0 :(得分:5)

您可以通过std::iterator_traits获取迭代器的value_type,然后在编译时检查它,例如

template<class iter_type>
void f(iter_type start, iter_type finish)
{
    static_assert(
      std::is_same<
        typename std::iterator_traits<iter_type>::value_type,
        specific_value_type>::value, 
      "The value_type must be specific_value_type.");

    // loop from start to finish
}

LIVE

答案 1 :(得分:2)

您可以使用std::enable_if

template<class iter_type>
auto f(iter_type start, iter_type finish)
 -> typename std::enable_if<std::is_same<
                            typename std::iterator_traits<iter_type>::value_type,
                            particular_value_type
                                        >::value, void>::type
{
   // loop from start to finish
}

这将使限制成为函数签名的一部分,这意味着您可以使用具有相同名称和参数的另一个函数模板,只要对此特定value_type禁用它。

编辑:使用iterator_traits使其更加强大。