假设我有一个函数模板来遍历某个容器的任何迭代器:
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()
只是一小段代码,不值得专门的课程。
答案 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
}
答案 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使其更加强大。