我要用大约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....
,array
和i
都是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风格的可变参数。