QuickFix/C++ 中的重复组

Luc*_*ini 5 c++ stl quickfix

我正在编写一个使用快速修复库的程序。文档很差,所以我请求SO研究员的帮助。

我在 Group 类中看到有迭代器。所以我认为有一些类似 STL 的方法来解析重复组。我错了吗?有人可以提供一个简单的例子吗?

预先非常感谢您。

ste*_*anB 3

类中有迭代器,类是和 类FieldMap的超类。MessageGroup

我不确定解析重复组是什么意思。

当原始修复消息到达时,修复引擎会为您解析原始修复消息,并且回调会获取已解析的 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;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

对于身体来说也是如此:

FIX::FieldMap::iterator it;
FIX::FieldMap::iterator b = msg.begin();
FIX::FieldMap::iterator e = msg.end();
Run Code Online (Sandbox Code Playgroud)

并且还有组迭代器 ( FieldMap::g_begin/g_end),因此您可以迭代消息或标头中的组,并且您可以类似地迭代或搜索每个组内的标签。

Group 和 Message 扩展了 FieldMap,因此所有 getField/setField 功能都可以共享。

内部结构...如果细节太多,请跳过。

在上面的例子中这段代码:

message.getGroup(1, group);
group.get(MDEntryType);
Run Code Online (Sandbox Code Playgroud)

有效地传递来自message.getGroup(1, group)-> FieldMap::getGroup(1, group.field(), group)-> getGroupRef(num,field)->的调用m_groups.find(field),它为您提供一个组向量 ( vector<FieldMap*>) 并返回num元素,即num消息中的组 (a FieldMap)。

group.get(field)是使用每个标签的宏创建的,它被有效地翻译为(map).getField(field). 在初始化期间,组的(映射)是对标签所属对象的引用,因此它从特定组返回标签(参见示例,src/C++/fix44/NewOrderSingle.h它有几个扩展 Group 的内部类)

希望这有一定道理。