使用C++追加CORBA序列的简便方法

uni*_*uni 4 c++ corba sequence omniorb

我正在使用omniORB和C++.

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

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

//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];
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Bri*_*eal 5

做这样的事情的小实用功能并不难.例如,您可以为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);
Run Code Online (Sandbox Code Playgroud)

请注意,某些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
Run Code Online (Sandbox Code Playgroud)

我也赞同stefaanv在评论中的建议.尽可能少地使用CORBA序列.基本上只在您需要拨打/接收CORBA呼叫的应用程序的"边缘"使用它.将数据放入标准容器中,以便更快地进行操作.不要让CORBA类型"渗透"到您的应用程序中.如果您决定移植到非CORBA环境,这也有助于使您的应用程序更具可移植性.

我还听说过正在提出的新的IDL到C++ 11映射.这将直接映射IDL序列std::vector,这将使事情变得相当容易.

  • IDL到C++ 11将IDL序列映射到std :: vector是正确的,这使得它更容易使用.此IDL到C++ 11映射已被采用并正式发布为OMG标准,请参阅http://www.omg.org/spec/CPP11/.在即将召开的OMG Berling会议上,我们将提供V1.1版本,您可以在http://www.omg.org/techprocess/meetings/schedule/IDL_to_C++11_1.1_RTF.html上在线查找或查看http:/ /osportal.remedy.nl.该规范已作为TAOX11产品的一部分完全实现,请参阅http://www.theaceorb.nl (2认同)