我想摆脱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 ) {}
我知道可以使用概念来转换此功能,但是我只是找不到很好的线索。
可能不是最容易理解的参考,但是有关概念的规范信息源是可用的标准草案。在语法上将概念定义指定为
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] 删除。
我来说两句