[英]Is there a 'requires' replacement for 'void_t'?
void_t
是檢測某些表達式的可編譯性的好方法,但我想知道是否有某種方法可以使用requires
(或 requires requires )進行檢查,因為從可讀性的角度來看我真的不喜歡void_t
。
例如,對於某種類型,我想檢查某些表達式是否正確(即可編譯),包括否定。
理想情況下,我希望這可行,但它不可行,可能是因為 lambda 沒有模板化......
#include <unordered_set>
int main() {
auto a = []() requires requires(int x) {x<x;} {};
auto b = []() requires !requires(std::unordered_set<int> x) {x<x;} {};
}
如果這種用法看起來很奇怪,我的真正動機是檢查某些東西是否無法編譯,例如我的非模板化類型沒有operator<
或者它不能從int
或......
PS:我知道boost::hana
有辦法做到這一點,我正在尋找香草 C++20 解決方案。
我真正的動機是檢查某些東西沒有編譯,例如我的非模板化類型沒有
operator <
這在概念上是可能的,也許我誤解了?
template<class T>
concept has_less_than = requires(const T& x, const T& y)
{
{x < y} -> std::same_as<bool>;
};
struct Has_Less
{
bool operator<(const Has_Less& other) const
{
return true;
}
};
struct Nope{};
int main()
{
static_assert(has_less_than<Has_Less>);
static_assert(!has_less_than<Nope>);
}
雖然@AndyG 的回答非常好,但我想補充一點。 您也可以創建一個臨時概念,就像您在下一個示例程序中看到的那樣(缺少包含):
void func( auto v )
{
// unnamed concept in constexpr if-branch!
if constexpr( requires { { v < v }->std::same_as<bool>; } ) {
// use operator
puts( "HAVE operator <" );
} else {
// cannot use operator
puts( "no operator <" );
}
}
struct X {};
int main()
{
func( 2 );
func( X{} );
return EXIT_SUCCESS;
}
在 C++20 模式下使用 VisualStudio 2022 (17.3.5) 進行測試。
這種技術被命名為“內省設計”。 我最近還為此寫了一篇簡短的博客文章(可以在我的個人資料中找到)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.