C ++ lambda和闭包

时间:2018-08-27 18:44:10

标签: c++ closures msgpack

我要用大约3000行的C ++替换大约6000行的反序列化C代码。现有的基本模式如下:

Private Sub CommandButton21_Click()
Dim sBuffer As String, sSubstitute As String, sFileName 
As String, sNewTagRef As Variant
Dim sOldFileRef As Variant
Dim Lastrow As Long
Dim i As Integer, iFileNum As Integer

'Path to target file
sFileName = Application.GetSaveAsFilename()

iFileNum = FreeFile
Open sFileName For Input As iFileNum

' Find the last row of specified column
Lastrow = Worksheets("Sheet1").Cells(Rows.Count, 4).End(xlUp).Row

For i = 2 To Lastrow

        'sOldFileRef is the search value and sNewTagRef is replacement value
        Sheets("Sheet1").Activate
        sOldFileRef = ActiveSheet.Cells(i, 4).Value
        sNewTagRef = ActiveSheet.Cells(i, 5).Value

          'Prepare file text for replacement text
          Do While Not EOF(iFileNum)
              Line Input #iFileNum, sBuffer
              sSubstitute = sSubstitute & sBuffer & vbNewLine

          Loop

      Close iFileNum

     'Search and Replace text
     sSubstitute = Replace(sSubstitute, sOldFileRef, sNewTagRef)

     'Modify text file
     iFileNum = FreeFile
     Open sFileName For Output As iFileNum
     Print #iFileNum, sSubstitute

Next i

Close iFileNum

End Sub

对给定结构中的每个变量重复一次。 ser_ret_t msgpack_unpack_mystruct(msgpack_object *obj, mystruct_t *d, void *unused = NULL) { NEXT_WORK_OBJ(array, i, work_obj); ret |= msgpack_unpack_line(work_obj, &d->line); NEXT_WORK_OBJ(array, i, work_obj); ret |= msgpack_unpack_node(work_obj, &d->leftNode); //etc.... arrayi都是msgpack使用的状态变量,而work_obj是任意结构指针。 d是一个预处理器宏,用于调整状态变量。 NEXT_WORK_OBJ是具有任意参数的函数。

这不仅冗长,而且不完整,因为即使在发生故障的情况下,仍会继续处理基础缓冲区。

我的想法是用state / helper类替换状态变量,其中一个问题是在类中调用任意函数。我通过不在lambda中进行调用来解决这个问题。

msgpack_unpack_*

class UnpackHelper { public: void GetNext(std::function<ser_ret_t(msgpack_object*)> callback) { //make sure it's safe to continue processing buffer. if (m_status != SER_SUCCESS) return; NextObj(); m_status |= callback(m_pWork); } }; 替换预处理器宏,并调整类内部状态变量。现在客户端代码如下所示:

NextObj()

我的问题特别是关于客户端代码和lambda。我的理解是ser_ret_t msgpack_unpack_mystruct(msgpack_object *obj, mystruct_t *d, void *unused = NULL) { UnpackHelper up; up.GetNext([=](auto pWork) {return msgpack_unpack_line(pWork, &d->line); }); up.GetNext([=](auto pWork) {return msgpack_unpack_node(pWork, &d->leftNode);}); 正在这里发生,我进一步了解不建议这样做。但是,由于捕获总是会发生在传递给函数(default capture)的指针的成员上,因此我相信这种模式是安全的。 鉴于将存在成千上万的lambda,我想避免不必要的冗长。 第二,是否可以通过任何方式缩短或删除参数列表? d很小,但是...

我的第三个新问题是基于对(auto pWork)的了解。.我的回调机制是否必要? std::function看起来像是我可以用来直接在类内创建任意调用的东西。我目前正在这里查看接受的答案:C++: pass function with arbitrary number of parameters as a parameter,以查看它是否可以应用于我的代码...无需使用C风格的可变参数。看起来这可以用,但是买了我只是由于模板扩展引起的代码膨胀。

0 个答案:

没有答案