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

标签 c++ sfinae c++20 enable-if c++-concepts

我要除掉所有的不洁enable_if s 在我的模板中,并用 C++20 概念替换它们,但是几乎没有关于概念的任何信息,并且我阅读的任何来源的语法都发生了变化。

这是一个函数,它接受带有 MyClass 的任何容器的两个迭代器。值(value)观:

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 A concept is a template that defines constraints on its template arguments.

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


它几乎就像一个 bool 变量模板常量,但它是用概念关键字定义的。所以将你的条件直接转化为一个概念本质上是这样的
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 ) {}

如果某个类型不满足约束,则丢弃此重载。在此上下文中不满意还包括替换失败。所以这和你最初的情况是一样的。

Live example

关于使用概念具有特定值类型的任何容器的 C++ 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61793688/

相关文章:

c++ - Boost.Asio async_从套接字读取字符串

c++ - 这个 has_member 类模板是如何工作的?

c++ - 为什么 void_t 在 SFINAE 中不起作用但 enable_if 起作用

c++ - 在 C++14、C++17、C++20 和不同的编译器中, float 和整数之间的按位转换是否有处理未定义行为的最佳方法?

c++ - 如何制作跨度的跨度

c++ - 跳过接收我通过无线网络广播的消息

c++ - 使用 Windows API 获取键盘输入的更好方法?

c++ - 3D多维数组到 "row"指针

c++ - SFINAE 多层类型测定

c++ - 如何用我自己的模板函数包装 std::format() ?