如何使用 STL 容器的概念?
How to use a concept for STL containers?
基于这个旧的堆栈溢出问题
我发现可以为 STL 容器定义一个概念。但是,我不确定如何将这个概念实际应用于任何事物,因为它需要 2 个容器,容器 a 和容器 b。
例如,取最多赞回答的签名
template <class ContainerType>
concept Container = requires(ContainerType a, const ContainerType b)
我只见过仅与 1 个需求参数一起使用的概念,就像这样
//source: https://en.cppreference.com/w/cpp/language/constraints
template<typename T>
concept Hashable = requires(T a)
{
{ std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};
struct meow {};
// Constrained C++20 function template:
template<Hashable T>
void f(T) {}
//
// Alternative ways to apply the same constraint:
// template<typename T>
// requires Hashable<T>
// void f(T) {}
//
// template<typename T>
// void f(T) requires Hashable<T> {}
int main()
{
using std::operator""s;
f("abc"s); // OK, std::string satisfies Hashable
// f(meow{}); // Error: meow does not satisfy Hashable
}
这个概念的定义实际上是
template <class ContainerType>
concept Container = /* */;
仅约束 一个 类型 ContainerType
,因此应用此概念的函数将是
template <Container C>
void f(C& c);
基于这个旧的堆栈溢出问题
我发现可以为 STL 容器定义一个概念。但是,我不确定如何将这个概念实际应用于任何事物,因为它需要 2 个容器,容器 a 和容器 b。
例如,取最多赞回答的签名
template <class ContainerType>
concept Container = requires(ContainerType a, const ContainerType b)
我只见过仅与 1 个需求参数一起使用的概念,就像这样
//source: https://en.cppreference.com/w/cpp/language/constraints
template<typename T>
concept Hashable = requires(T a)
{
{ std::hash<T>{}(a) } -> std::convertible_to<std::size_t>;
};
struct meow {};
// Constrained C++20 function template:
template<Hashable T>
void f(T) {}
//
// Alternative ways to apply the same constraint:
// template<typename T>
// requires Hashable<T>
// void f(T) {}
//
// template<typename T>
// void f(T) requires Hashable<T> {}
int main()
{
using std::operator""s;
f("abc"s); // OK, std::string satisfies Hashable
// f(meow{}); // Error: meow does not satisfy Hashable
}
这个概念的定义实际上是
template <class ContainerType>
concept Container = /* */;
仅约束 一个 类型 ContainerType
,因此应用此概念的函数将是
template <Container C>
void f(C& c);