C++20 概念:多个 return 类型要求?
C++20 concepts: multiple return type requirements?
我想实现一个concept
,其中有多个return类型的成员函数。
例如:
template<typename C>
concept Container = requires(C a) {
{a.begin()} ->
std::same_as<typename C::iterator> ||
std::same_as<typename C::const_iterator>;
};
上面的代码强制 a.begin()
的 return 类型为 C::iterator
或 C::const_iterator
。
但是编译不了。
还有其他方法吗?
使用无糖形式。
template<typename C>
concept Container = requires(C a) {
requires std::same_as<decltype(a.begin()), typename C::iterator> ||
std::same_as<decltype(a.begin()), typename C::const_iterator>;
};
您可以编写一个概念来测试该类型是否是容器的迭代器类型之一:
template<typename It, typename Container>
concept is_container_iterator =
same_as<It, typename Container::iterator> || same_as<It, typename Container::const_iterator>;
然后您可以在代码中使用该概念:{a.begin()} -> is_container_iterator<C>;
我想实现一个concept
,其中有多个return类型的成员函数。
例如:
template<typename C>
concept Container = requires(C a) {
{a.begin()} ->
std::same_as<typename C::iterator> ||
std::same_as<typename C::const_iterator>;
};
上面的代码强制 a.begin()
的 return 类型为 C::iterator
或 C::const_iterator
。
但是编译不了。
还有其他方法吗?
使用无糖形式。
template<typename C>
concept Container = requires(C a) {
requires std::same_as<decltype(a.begin()), typename C::iterator> ||
std::same_as<decltype(a.begin()), typename C::const_iterator>;
};
您可以编写一个概念来测试该类型是否是容器的迭代器类型之一:
template<typename It, typename Container>
concept is_container_iterator =
same_as<It, typename Container::iterator> || same_as<It, typename Container::const_iterator>;
然后您可以在代码中使用该概念:{a.begin()} -> is_container_iterator<C>;