gpt4 book ai didi

c++ - 使用 SFINAE 检查函数是否为 constexpr

转载 作者:行者123 更新时间:2023-12-01 14:07:00 24 4
gpt4 key购买 nike

我想检查一个函数是否可以在编译期间被评估。我找到了 this ,但我不完全理解这个概念。我有几个疑问:

  • 下面一行在代码中的作用是什么?template<int Value = Trait::f()>
  • 每次当我需要检查该函数是否可在编译时求值时,是否需要将其设为某个结构的成员函数?

  • PS
    我复制链接中的代码,只是为了方便。
    template<typename Trait>
    struct test
    {
    template<int Value = Trait::f()>
    static std::true_type do_call(int){ return std::true_type(); }

    static std::false_type do_call(...){ return std::false_type(); }

    static bool call(){ return do_call(0); }
    };

    struct trait
    {
    static int f(){ return 15; }
    };

    struct ctrait
    {
    static constexpr int f(){ return 20; }
    };

    int main()
    {
    std::cout << "regular: " << test<trait>::call() << std::endl;
    std::cout << "constexpr: " << test<ctrait>::call() << std::endl;
    }

    最佳答案

    这里只是一个快速示例,说明您可以使用 std::void_t 获得什么|解决您的第 2 点,它在某种程度上可能是通用的...

    #include <iostream>
    #include <type_traits>

    int f() {
    return 666;
    }

    constexpr int cf(int, double) {
    return 999;
    }

    template <auto F>
    struct indirection {
    };

    template<typename F, class = std::void_t<> >
    struct is_constexpr : std::false_type { };

    template<typename F, typename... Args>
    struct is_constexpr<F(Args...),
    std::void_t<indirection<F(Args{}...)>>
    > : std::true_type { };

    int main()
    {
    std::cout << is_constexpr<decltype(f)>::value << std::endl;
    std::cout << is_constexpr<decltype(cf)>::value << std::endl;
    };
    Demo here

    关于c++ - 使用 SFINAE 检查函数是否为 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63478686/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com