Saturday, August 12, 2023

淺談 C++ 的 requires 關鍵字

引言
使用 Template 模板的時候,如果可以加上 requires 關鍵字,就可以對不同的資料類型,實體化出不同的的函式,或者做編譯時期的檢查。

例子

#include <iostream>

template<typename T>
T addition(T a, T b)
{
constexpr bool valid = requires (T x) { x + x; };
if (valid)
{
return a + b;
}
else
{
return T{};
}
}

int main(int argc, char** argv)
{
std::cout << addition(1, 2) << std::endl;
return 0;
}

執行結果
3

說明
當我們在函式中使用了 constexpr 和 requires,它就會在編譯時期把檢查做完,然後只實體化相關部分的模板。用以上的 addition 為例,使用這個方法,我們就能使用一個模板,對所有不同的類型進行支持,而不需要不斷以不同的輸入類型,去重載同一個函式。

其實 requires 的用法還有很多,不過為了簡單,就先說到這裏吧。