4

我正在使用omniORB 和C++。

在我的应用程序中,我得到几个小的 CORBA 序列形成不同的模块,然后我需要将它们组合成一个大序列以进行进一步处理。有简单的方法吗?像seq2.append(seq1)或之类的东西seq2.push_back(seq1)。还是一些运营商?(我真的是 STL 方面的新手)。

我发现的唯一方法是手动遍历小序列的每个元素并将其添加到大序列中。

//idl
struct Device;
typedef sequence<Device> DevicesList;

//c++
icore::DevicesList full_list;
foreach (const DStatusList &stlist, states_) {
    icore::DevicesList list = convertList(stlist);
    int newlength = full_list.length() + list.length();
    int last_index = full_list.length();
    full_list.length(newlength);
    int j=0;
    for(int i=last_index; i< last_index+list.length(); i++,j++) {
        full_list[i] = list[j];
    }
}

谢谢你。

4

1 回答 1

6

为做这样的事情制作小的实用功能并不难。例如,您可以为 CORBA 序列制作自己的 push_back:

template<class Seq, class T>
void push_back(Seq& seq, const T& item)
{
   const CORBA::ULong len = seq.length();
   seq.length(len + 1);
   seq[len] = item;
}

MySequence s;
push_back(s, 42);

请注意,某些 ORB 的序列类型不会过度分配内存push_back(就像std::vector确实如此),因此这可能会在每次push_back()调用时触发重新分配和复制。这可能是性能问题。您必须检查您的 ORB 是否这样做,可能通过查看源代码来了解它是否有问题。不幸的是,我认为omniORB 有这个问题。至少几年前是这样的。

缓解这种情况的一种方法是使用最大值构建序列(如果您事先知道的话)。这将预先进行一个大分配,然后您可以调用push_back()该最大值而不会触发重新分配:

MySequence s(100);   // construct with maximum; allocation happens here
push_back(s, 42);    // no reallocation
push_back(s, 0);     // no reallocation

我也同意 stefaanv 在评论中的建议。尽可能少地使用 CORBA 序列。基本上只在您需要发出/接收 CORBA 调用的应用程序的“边缘”使用它。将数据尽快放入更容易操作的标准容器中。不要让 CORBA 类型“渗透”到您的应用程序中。如果您决定移植到非 CORBA 环境,这也有助于使您的应用程序更具可移植性。

我还听说有人提出了一个新的 IDL 到 C++11 的映射。这会将 IDL 序列映射到其上std::vector,这将使事情变得相当容易。

于 2013-06-04T14:16:35.477 回答