使用概念的具有特定值类型的任何容器的 c++ 迭代器
c++ iterator of any container with specific value type using concepts
我想摆脱我模板中所有邪恶的 enable_if
s 并用 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 A concept is a template that defines constraints on its
template arguments.
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 ) {}
如果类型不满足约束,则丢弃此重载。在此上下文中不满意还包括替换失败。所以这和你最初的情况是一样的。
最直接的翻译是
template <typename IteratorType>
requires std::same_as<typename std::iterator_traits<IteratorType>::value_type, MyClass>
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)
{
// ...
}
我想摆脱我模板中所有邪恶的 enable_if
s 并用 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 A concept is a template that defines constraints on its template arguments.
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 ) {}
如果类型不满足约束,则丢弃此重载。在此上下文中不满意还包括替换失败。所以这和你最初的情况是一样的。
最直接的翻译是
template <typename IteratorType>
requires std::same_as<typename std::iterator_traits<IteratorType>::value_type, MyClass>
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)
{
// ...
}