【C++】requires關鍵字簡介

縉雲燒餅發表於2023-05-15

requires 是 C++20 中引入的一個新關鍵字,用於在函式模板或類别範本中宣告所需的一組語義要求,它可以用來限制模板引數,類似於 typenameclass 關鍵字。

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);}

相關文章