#include <concepts>
#include <string>
#include <type_traits>
template<typename T>
requires requires(T const& t) {
!std::is_enum_v<T>;
{ std::to_string(t) } -> std::same_as<std::string>;
}
void Foo(T const&) {
}
template<typename T>
requires std::is_enum_v<T>
void Foo(T const&) {
}
enum Color {
Red,
Green,
Blue,
};
int main() {
Foo(Red); // error: Call to 'Foo' is ambiguous
}
显然,两个重载的
Foo
是互斥的;也就是说,如果std::is_enum_v<T>
是true
,则不应选择前者。但是clang-18 -std=c++20
给出了错误。
!std::is_enum_v<T>
块中的requires
结构良好,因此被接受。要检查该值,您需要编写 requires(!std::is_enum_v<T>)
。这两件事可以结合起来,如下例所示:
template<typename T>
requires(!std::is_enum_v<T>) &&
requires(T const& t) {
{ std::to_string(t) } -> std::same_as<std::string>;
}
void Foo(T const&) {
}