指定std :: function的默认值

时间:2015-11-20 08:41:14

标签: c++ lambda

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

什么是空的&#39;应该?我使用[](){}。但从技术上讲,这不是空的,f()将执行。

4 个答案:

答案 0 :(得分:51)

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Mysqlconn = New MySqlConnection
    Mysqlconn.ConnectionString =
    "server=localhost;userid=root;password=baby;database=database"
    Dim Reader As MySqlDataReader

    Try
        Mysqlconn.Open()
        Dim Query As String
        Query = "select * from database.testclass where Room='" & cbrm.Text & "' and Day='" & cbday.Text & "' and Start='" & cbstart.Text & "' and End='" & cbend.Text & "'"
        Command = New MySqlCommand(Query, Mysqlconn)
        Reader = Command.ExecuteReader
        While Reader.Read
            If cbrm.Text = Reader.GetString("Room") And cbday.Text = Reader.GetString("Day") And cbstart.Text >= Reader.GetString("Start") And cbend.Text < Reader.GetString("End") Then
                MessageBox.Show("There is/are conflict/s")
            Else
                MessageBox.Show("There is/are no conflict/s")
            End If
        End While

            Mysqlconn.Close() 
    Catch ex As MySqlException
        MessageBox.Show(ex.Message)
    Finally
        Mysqlconn.Dispose()
    End Try
End Sub

LIVE DEMO

答案 1 :(得分:19)

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

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

答案 2 :(得分:10)

我会在空案例中使用nullptr。可以使用它,因为你从不使用完整的函数对象而只是指向它们的指针,所以func(f1);实际上是func(&f1) =&gt;你总是将指针传递给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

答案 3 :(得分:3)

您可以尝试这样:

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)当函数包装器对象时   没有目标。