簡體   English   中英

是否有 'void_t' 的 'requires' 替代品?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM