gpt4 book ai didi

c++ - 如何在编译时检查函数具有默认参数值?

转载 作者:行者123 更新时间:2023-12-04 07:41:15 24 4
gpt4 key购买 nike

所有尝试做的就是制作这段代码

int main() {

if constexpr( ??? ) {
std::cout << "Yes\n";
std::cout << f() << '\n';
std::cout << f(42) << '\n';
}
else {
std::cout << "No\n";
}

return 0;
}
  • 编译如果函数f定义为这些示例中的任何一个

  • // Example 1
    int f(int n = 0) { return n; }

    // Example 2
    int f(int n) { return n; }
    int f() { return 0; }

    // Example 3
    int f(int n) { return n; }
  • 和显示 Yes例如12 , 并显示 No例如3 .

  • 这甚至可能吗?我想我见过有人用 SFINAE 做这件事,但我不记得它到底是怎么做的,以及我在哪里看到的。先感谢您。

    最佳答案

    if constexpr无法保护格式错误的代码 外面任何模板(例如,在 main 中)。显而易见的事情是编写一个接受 f 的模板。本身作为模板参数,但要做到这一点,您必须 reify 你的过载设置。通常的做法是作为 SFINAE 友好 功能对象:

    template<class F,class=void>
    constexpr bool opt=false;
    template<class F>
    constexpr bool opt<F,decltype(std::declval<F>()(1),void(std::declval<F>()()))> =true;

    template<class F> int use(F &&x) {
    if constexpr(opt<F>) return x(1)+x();
    else return 0;
    }

    const auto f_=[](auto &&...aa) -> decltype(f(std::forward<decltype(aa)>(aa)...))
    {return f(std::forward<decltype(aa)>(aa)...);};

    int main() {use(f_);}
    在某些情况下,还可以选择创建使用 调用的“假”模板。正式依赖,但总是使用你想要的类型,但这对于调用来说是不可能的 f()没有参数,如果您的 f 立即出现格式错误(可能不需要诊断)需要一个参数,因为它不能依赖于模板参数。

    关于c++ - 如何在编译时检查函数具有默认参数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67453732/

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