requires 是 C++20 中引入的一個新關鍵字,用于在函式模板或類模板中宣告所需的一組語意要求,它可以用來限制模板引數,類似于 typename 和 class 關鍵字,
requires關鍵字常與type_traits頭檔案下型別檢查函式匹配使用,當requires后的運算式值為true時滿足requires條件,代表由其修飾的函式/類的模板引數合法,可以正常使用
requires 關鍵字可以用于以下兩種情況:
- 在函式模板或成員函式中,使用
requires關鍵字限制函式模板或成員函式的引數或回傳值必須滿足一定的語意要求,例如:
template <typename T>
void print(T t) requires std::is_integral_v<T> {
std::cout << t << std::endl;
}
在這個例子中,使用 requires 關鍵字限制函式模板引數 T 必須是整數型別,
- 在類模板或成員類中,使用
requires關鍵字限制類模板或成員類必須滿足一定的語意要求,例如:
template <typename T>
requires std::is_integral_v<T>
class IntContainer {
public:
IntContainer(T t) : value_{t} {}
private:
T value_;
};
在這個例子中,使用 requires 關鍵字限制類模板引數 T 必須是整數型別,
需要注意的是,requires 關鍵字僅能用于函式模板和類模板中,不能用于非模板函式和非模板類,此外,requires 關鍵字的語意要求必須在編譯時可驗證,否則將引發編譯時錯誤,
#include <iostream>
class TestRequires
{
public:
template <typename T>
static void test(T t)
requires std::is_integral_v<T>
{
std::cout << "test(T t) requires int" << std::endl;
}
template <typename T>
static void test(T t)
requires std::is_floating_point_v<T>
{
std::cout << "test(T t) requires float" << std::endl;
}
};
int main()
{
TestRequires::test(123);
TestRequires::test(1.234);
return 0;
}
除此之外,requires關鍵字也可以用于型別轉換前的檢查(假如函式內需要):
template <typename T>
int64_t unpack(T v) requires std::is_integral<T>::value
{return static_cast<int64_t>(v);}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552423.html
標籤:其他
下一篇:返回列表
