注册 登录
编程论坛 C++教室

c++11中如下lambda操作如何在c++98使用bind2nd实现

S140131022 发布于 2018-11-13 17:36, 2673 次点击
功能很简单,主要是为了实现容器的每个元素中一个成员变量的赋值操作,但是这个元素是一个类成员函数,所以我就不会了!

其中:m_MessageBox[serviceID]是一个Vector,其元素定义为:
程序代码:
// 消息元素,用于保存Refresh线程中缓存的消息
class MessagBrick
{
public:
    HKEX_OMDD::Uint16            MsgType;        // Type of message.
    HKEX_OMDD::Uint16            MsgSeq;            // RealSeqNum of message
    char                        Content[1000];    // Message Content
    MessagBrick()
    {
        MsgType = 0;
        MsgSeq = 0;
        memset(Content, 0, sizeof(Content));
    }
};

typedef std::vector<MessagBrick> MessVector;


使用迭代器实现如下:
    //MessVector::iterator iter = m_MessageBox[serviceID].begin();
    //for (; iter != m_MessageBox[serviceID].end(); ++iter)
    //{
    //    iter->MsgSeq = seqID;
    //}

C++11使用lambda实现如下:
for_each(m_MessageBox[serviceID].begin(), m_MessageBox[serviceID].end(), [seqID](MessagBrick& element) {element.MsgSeq = seqID; });

请问使用C++98中的bind2nd怎么实现,以前学过,但是很久没用忘记了~

谢谢各位大神!
7 回复
#2
复旦2018-11-13 18:24
for(所有的m_Messagebox里面的成员)

    bind2nd(元素.MessageBrick(), 5) )


bind2nd的功能是绑定函数的第二个元素值。
#3
S1401310222018-11-13 19:24
回复 4楼 复旦
这个5是什么意思哦? 可否详细一点呢
#4
复旦2018-11-13 19:48
5是我随便写的。 5的位置填写想要赋值的数字。
#5
S1401310222018-11-13 19:51
回复 6楼 复旦
能否直接写出答案,我之所以不会用是因为单个元素是一个class,而不是基本数据类型,如果是基本数据类型我还是会的。

#6
复旦2018-11-13 20:54
刚刚理解错了问题,以为是改变某个函数里面的元素。 不好意思。
但是,bind2nd是函数值绑定器。我不太理解你为什么要用这个来赋值变量。
C98里可以用迭代器赋值的呢。
#7
S1401310222018-11-14 08:10
回复 8楼 复旦
因为想实现区间赋值,感觉它比使用迭代器进行for循环效率要高一些!
#8
rjsp2018-11-14 08:42
使用 bind2nd 的话,你总得独立写个 函数 或 仿函数 吧,岂不是代码变得更臃肿?
for_each 并不比 for循环 效率更高
1