使用概念对具有特定值类型的任何容器进行 C++ 迭代
c++ iterator of any container with specific value type using concepts
我想摆脱模板中所有不神圣的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
它几乎就像一个布尔变量模板常量,但它是用概念关键字定义的。因此,将您的条件直接转换为概念本质上是这样的
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 ) {}
如果不满足某个类型的约束,则放弃此重载。在这种情况下,不满意还包括替换失败。所以这是你最初的情况。
现场示例
为了适应 C++20 Ranges 生态系统:
template <std::input_iterator I, std::sentinel_for<I> S>
requires std::same_as<std::iter_value_t<I>, MyClass>
constexpr void myFunction(I begin, S end)
{
// ...
}
最直接的翻译是
template <typename IteratorType>
requires std::same_as<typename std::iterator_traits<IteratorType>::value_type, MyClass>
void myFunction(IteratorType begin, IteratorType end) {}
看:
- https://en.cppreference.com/w/cpp/language/constraints 和
- https://en.cppreference.com/w/cpp/concepts
戈博尔特示例
相关文章:
- std::map 保存任何值类型
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- 有没有办法在函数 c++ 中输入任何数据类型?
- 如何实现一个接受任何容器类型的函数
- 整数文本太大,无法用任何整数类型表示--C++
- 任何指针类型的模板专业化
- 使用模板C++任何集合类型的包装器
- C 通用函数以除以任何数据类型
- 声明类型没有任何可变类型
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- 在任何类类型上使用模板方法中的 new
- C++任何非类型参数的模板专用化
- 是否有任何数据类型或方法可以计算当前单元格中先前数组单元格的总和
- 将任何数据类型/对象作为参数传递以确定其大小
- 任何返回类型的可变参数函数包装器
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 难以创建可以容纳任何数据类型的模板通用向量
- STD ::变体与STD ::任何当类型移动时可构造时
- wchar_t保证与任何整数类型不同
- 将运算符类型转换为除某些引用之外的任何算术类型