举个实际的例子说明如何在 C++ 中使用 `where` 进行类型约束?
时间: 2024-09-21 22:13:09 浏览: 31
在 C++ 中,`where` 通常结合 SFINAE(Substitution Failure Is Not An Error,替换失败不是错误)技术使用,以下是一个简单的例子,我们创建一个模板函数,只接受可以比较大小的自增整数类型:
```cpp
#include <type_traits>
template<typename T>
concept Compareable = std::integral<T> && std::is_nothrow_incrementable_v<T>;
template<Compareable where T>
void printIfComparable(T x)
{
if constexpr (Compareable<T>{}) {
std::cout << "Comparing: " << x << std::endl;
} else {
// 如果T类型不符合要求,则这里不会执行
static_assert(!"Cannot compare this type");
}
}
int main()
{
printIfComparable(5); // 正常打印,因为整型支持比较
printIfComparable(std::string{}); // 不打印,因为字符串类型不符合要求
return 0;
}
```
在这个例子中,`Compareable` 是一个名为 `concept` 的用户定义类型标记,它仅适用于那些是整数并且支持无异常增量的类型。然后我们在 `printIfComparable` 函数里,使用 `if constexpr` 和 `where` 来确保类型 `T` 符合 `Compareable` 的约束。如果尝试传递一个不满足这些条件的类型,编译器会抛出一个静态断言错误,而不是在运行时失败。
阅读全文