【问题标题】:specify default value of std::function指定 std::function 的默认值
【发布时间】:2016-02-22 16:19:50
【问题描述】:
void func(const std::function<void()>& f = empty)
{
    if(f)
        f();
}

“空”应该是什么?我使用 [](){} 。但从技术上讲,那不是空的,f() 会执行。

【问题讨论】:

    标签: c++ lambda


    【解决方案1】:
    void func(const std::function<void()>& f = {}) {
        if(f) f();
    }
    

    LIVE DEMO

    【讨论】:

    • @suzuiyue 什么意思?
    • 我没有看到 bool cast 或 ! doc 中的运算符重载。那么为什么 if(f) 或 if (!f) 有效呢?
    • @suzuiyue 我现在才进入 std::funtion,但我认为这是因为它是作为 C 风格函数指针的 C++ 替代品创建的,您可以在其中检查 fp 是否为null,而 f 将是指向由 lambda 创建的未命名函数的函数指针。如果我错了,有人可以在这里纠正我。
    【解决方案2】:
    const std::function<void()>& f = nullptr
    

    const std::function<void()>& f = std::function<void()>()
    

    【讨论】:

    • 是的,默认的std::function 会抛出一些异常(我忘了是哪一个)......
    • @BasileStarynkevitch 但 OP 的代码会在调用之前检查函数以查看它是否为空。或者这不是你的意思?
    • @BasileStarynkevitch:- 正在寻找这个:1/ An exception of type bad_function_call is thrown by function::operator() (20.8.11.2.4) when the function wrapper object has no target. ?
    【解决方案3】:

    我会为空的情况使用 nullptr。之所以可以使用它,是因为您从不使用完整的函数对象,而只使用指向它们的指针,所以 func(f1); 实际上将是 func(&amp;f1) => 您将始终将指针传递给 func,因此 nullptr 是恕我直言的最佳候选者。

    编译并运行:

    void func(const std::function<void()>& f = nullptr)
    {
        if(f)
            f();
    }
    

    使用默认函数的替代方法是:

    void func(const std::function<void()>& f = std::function<void()>()) {
        try {
            f();
        }
        catch(std::bad_function_call e) {
        }
    }
    

    使用异常捕获。 2之间的选择主要看你是否期望出现空壳;几乎从不:例外与有时:调用前测试。

    问题提到if (f),使用nullptr

    【讨论】:

      【解决方案4】:

      你可以这样试试:

      const std::function<void()> & f = std::function<void()>()
      

      Basile 补充说,标准说:

      § 20.8.11.1 类 bad_function_call [func.wrap.badcall]

      1/ bad_function_call 类型的异常被抛出 function::operator() (20.8.11.2.4) 当函数包装对象 没有目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 2019-02-08
        • 1970-01-01
        相关资源
        最近更新 更多