如何使用Lambda表达式更改代码?

3

我正在学习使用lambda表达式的C++技术。

我试图将已经使用for或while编写的代码更改为lambda表达式,并且我有一个与lambda相关的问题。

我正在尝试使用lambda或for_each(C++11)来更改代码。应该如何更改呢?

以下是要更改的代码:

std::string PointToString(void* p_pData)
{
    char* p = (char*)p_pData;

    int iLength = 0;
    std::memcpy(&iLength, p, sizeof(int));
    p += sizeof(int);

    std::string sRet;
    std::array<char, 3> szB;
    sRet.append("0x");

    for ( int i = 0; i < iLength; i++ )
    {
        sprintf(szB.data(), "%02X", (unsigned char)*(p++));
        sRet.append(szB.data());
    }

    return sRet;
}

这段代码将内存值转换为十六进制代码。

该函数的调用方式如下:

char szB[15] = {0x0b, 0x00, 0x00, 0x00, 0xc7, 0xd1, 0xb1, 0xdb, 0xc0, 0xd4, 0xb4, 0xcf, 0xb4, 0xd9, 0x2e};

void* p = nullptr;

p = (void*)szB;

sRet = PointToString(p);

结果可能是0x0B000000C7D1.....

我想在PointToString函数中尝试lambda表达式。我该如何修改这个函数?


2
你的示例似乎不匹配 - 你的代码读取了2个字节的长度,然后再读取相同数量的字节。但是你的示例结果没有读取长度。而且0x0B11,所以即使它读取了长度,你的输入也多了2个字节。 - M.M
1个回答

4

那么,你可以这样写:

std::for_each(p, p + iLength, [&](unsigned char ch)
{
    sprintf(szB.data(), "%02X", ch);
    sRet.append(szB.data());
});
&表示您将通过引用操作szBsRet,而不是操作它们的副本。在我看来,这并没有比您的原始代码显着改进。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接