我正在编写一个使用quickfix库的程序。文档非常差,所以我需要SO研究员的帮助。
我在Group类中看到有迭代器。因此,我认为存在某种STL式的解析重复组的方式。我错了吗?
有人可以提供一个简单的例子吗?
提前非常感谢您。
最佳答案
FieldMap
类中有迭代器,它是Message
和Group
类的父类(super class)。
我不确定解析重复的组是什么意思。
修复引擎在到达原始修复消息时为您解析原始消息,并且您的回调函数将解析为FIX消息-该消息具有消息头,正文和尾部中的标签的内部标签映射(键/值)。
查看1.13.2版本的代码,当引擎从网络获取新的字符串消息时,它将最终创建一个Message
并将其传递给该字符串。然后,Message
构造函数自行调用setString()
,以有效地解析接收到的字符串并创建标签映射。
如果查看Message::setString
,可以看到首先添加了新字段,然后在setGroup
中检查了该字段是否属于该组。如果是的话,此方法setGroup
将接管以下标签的解析,而这些标签是该组的一部分。一旦遇到不属于该组的标记,它将停止解析该组,然后返回并继续解析消息中的字段。
现在,所有这些操作都在内部回调到处理您收到的消息的应用程序回调之前发生。
有一种方法可以遍历消息中的字段。您可以遍历标题,正文或组(以及每个组)的字段。
const FIX40::ExecutionReport& msg; // new incoming message
// iterate over header
FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.getHeader().begin();
FIX::FieldMap::iterator e = msg.getHeader().end();
for(it = b; it != e; ++it)
{
switch(it->first)
{
case FIX::FIELD::MsgSeqnum:
/* it->second.getString() - do something with tag data*/ ;
break;
...
}
}
同样对于 body :
FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.begin();
FIX::FieldMap::iterator e = msg.end();
而且还有组迭代器(
FieldMap::g_begin/g_end
),因此您可以遍历msg或header中的组,并且可以类似地遍历或搜索每个组中的标签。组和消息扩展了FieldMap,因此所有的getField / setField功能都可以共享。
内部构件...如果细节过多,请跳过。
在上面的示例中,此代码:
message.getGroup(1, group);
group.get(MDEntryType);
有效地从
message.getGroup(1, group)
-> FieldMap::getGroup(1, group.field(), group)
-> getGroupRef(num,field)
-> m_groups.find(field)
传递 call ,这会给您一个组 vector (vector<FieldMap*>
),并返回num
元素,也就是消息中的num
组(一个FieldMap
)。group.get(field)
是使用宏为每个标签创建的,每个标签都有效地转换为(map).getField(field)
。在初始化期间,group的(映射)是对标签所属的对象的引用,因此它从特定组中返回标签(请参见
src/C++/fix44/NewOrderSingle.h
示例,它具有几个扩展Group的内部类)希望这有道理。