使用概念的具有特定值类型的任何容器的C ++迭代器

马特·凯莱门

我想摆脱enable_if模板中的所有弊端,并用C ++ 20概念替换它们,但是几乎没有关于概念的任何信息,语法的变化几乎与我阅读的任何来源一样。

这是一个需要两个带有MyClass值的容器的迭代器的函数:

template <class IteratorType, typename = std::enable_if<std::is_same<
                                typename std::iterator_traits<IteratorType>::value_type,
                                MyClass
                            >::value, void>>
void myFunction( IteratorType begin, IteratorType end ) {}

我知道可以使用概念来转换此功能,但是我只是找不到很好的线索。

讲故事的人-Unslander Monica

可能不是最容易理解的参考,但是有关概念的规范信息源是可用的标准草案。在语法上将概念定义指定为

1概念是一个模板,它定义了对其模板参数的约束。

concept-definition:
  concept concept-name = constraint-expression ;
concept-name:
  identifier

它几乎和bool变量模板常量一样,但是它是用concept关键字定义的。因此,将您的病情直接转化为概念本质上就是这样

template<typename T>
concept MyClassIter = std::is_same_v<
                        MyClass, 
                        typename std::iterator_traits<T>::value_type
                      >;

有了这个概念,我们就可以将其用作模板类型参数的类型约束,从而将您的模板转换为

template <MyClassIter IteratorType>
void myFunction( IteratorType begin, IteratorType end ) {}

如果类型的约束不满足,则此重载将被丢弃。在这种情况下不满意还包括替代失败。因此,这与您最初的情况相同。

现场例子

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章