2013-06-04 55 views
4

我使用的是omniORB和C++。使用C++附加CORBA序列的簡單方法

在我的應用程序中,我得到幾個小的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]; 
    } 
} 

謝謝。

+0

在我的情況下,我可以結合基本列表(而不是CORBA),然後將結果轉換爲CORBA列表。但問題要求瞭解其他方式。儘管對英語不好,但很抱歉 – uni

+2

我建議以這種方式使用它:嘗試儘可能保持通信的CORBA類型,並使用std(或您自己的)容器進行處理。 – stefaanv

+1

新的IDL到C++ 11l語言映射確實使用std容器而不是特殊的CORBA類型,請參閱http://swsupport.remedy.nl以獲取TAOX11,這是一個支持此新映射的CORBA實現。 –

回答

5

對於像這樣的東西製作小實用函數並不難。例如,你可以使自己的push_back爲CORBA序列:

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上,這將使事情變得更容易。

+2

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 –

相關問題