2012-04-01 19 views
2

問題是特定的,但解決方案是開放式的。我是一個單獨的編碼人員,希望與其他程序員打個仗。具有單個成員(也是自定義結構)的自定義結構(包裝器)集合到單個成員的集合

我有一個數學庫的包裝。包裝爲系統提供了一個一致的接口,同時允許我爲不同平臺切換數學庫。包裝器包含一個成員,所以對我的Matrix4x4包裝器類來說,有一個api_matrix_4x4結構作爲包裝器的唯一成員。

我目前的目標平臺有一個漂亮的小優化庫,其中一些漂亮的函數需要包裝器的嵌入成員的C風格的數組,而我的包裝函數,這些數學API函數不希望公開成員類型到系統的其餘部分。所以我們有一些包裝器(參考/指針)進入函數,&函數中的集合中需要wappers的成員,所以他們可以傳遞給數學API。

我主要使用C++,包括C++ 11的功能,&也可以走C風格。理想情況下,我想要一個沒有例外的解決方案,即使不是全部動態分配,也要儘量避免。我的包裝函數可以使用標準庫數組或向量,或者C型指針指向數組作爲參數,無論內部需要什麼,只需要動態轉換(運行時類型信息)。

1)我可以將包含單個自定義結構的自定義結構/類轉換爲自定義結構嗎?如果是這樣,那麼如果它是它們的標準庫集合呢?我正在考慮在這裏進行類型切片。

2)你可能使用模板來掩蓋傳遞給函數的類型,雖然實現只能作用於單一類型(基於使用的數學API),還是被認爲是不好用的模板?

3)你能想出一個漂亮的解決方案,可能涉及交換/移動語義/安置?如果是這樣,請告訴我關於它的幫助。

4)或者我辭職到明顯的位置,迭代一個集合,將成員放到另一個集合中,然後將其用於API函數?

的什麼,我由包裝結構&包裝函數簽名做

例如,我試圖避免&例如做的是通過函數實現給定:

struct Vector3dWrapper 
{ 
    API_Specific_Vector_3d m_api_vector_3d; 

    inline void operation_needing_vector_3d_wrappers(std::vector<Vector3d>& vectors) 
    { 
     // Now need a collection of API_Specific_Vector_3ds 
     try 
     { 
     std::Vector<API_Specific_Vector_3d> api_vectors; 
     api_vectors.reserve(vectors.size()); 
     for(auto vectors_itr = vectors.begin(); vectors_itr != vectors.end(); ++vectors) 
     { 
      // fill each Vector3d.m_api_vector_3d into api_vectors 
     } 
     } 
     catch(std::bad_alloc &e) 
     { 
     // handle... though in reality, try/catch is done elsewhere in the system. 
     } 



     // Signature is API_Multiply_Vectors_With_Matrix_And_Project(API_Specific_Vector_3d* vectors, size_t vector_count) 
     API_Multiply_Vectors_With_Matrix_And_Project(&api_vectors, api_vectors.size()); 
    } 

}; 
+2

這個問題涵蓋了相當廣泛的話題。你能更具體一些,舉一些例子嗎? – leftaroundabout 2012-04-01 14:55:09

回答

1
  1. 你可以投出標準佈局結構(比如與C兼容的結構)到第一個成員,但是有什麼意義?只需訪問第一個成員並申請&即可。

  2. 模板通常允許統一參數化一組類型。你可以編寫一個只能實例化一次的模板,但似乎沒有意義。你真正想要的是每個平臺都有一個不同的接口庫。也許模板可以幫助定義它們之間共享的通用代碼。或者你可以在簡單的C中做同樣的操作,在#include之前設置typedef

  3. 解決方案是什麼?默認的複製和移動語義應該適用於包含數字的扁平C風格結構。至於深層副本,如果底層庫具有基於指針的結構,則需要小心並實現所有需要的語義。安全...簡單...默認...「俏皮」聽起來很髒。

  4. 不知道我明白你在做什麼與集合。你的意思是每個函數都要求它的參數首先被插入到一個通用的容器對象中?構造容器聽起來很昂貴。您的函數應該儘可能並行執行底層庫中的函數。

+0

非常感謝。 1是有用的知道。我認爲2會允許我進行統一的參數化,但是對於單個實例化來說,它只是一個掩碼,這對我所需要的也許是可以的。 3我知道他們爲平面C風格的結構工作,並且不需要深度拷貝,因爲沒有與成員相關的指針。 Re 4,它只有25個函數中的2個函數,數學API需要它所包含的類型的集合。我只是不想從外部向外部公開這些類型。 – codey 2012-04-01 15:58:42

+0

對於3,我想我正在尋找「巧妙和高效」的容器+類型轉換成語/技巧,儘管安全性會成爲一個問題。也許,從我的頭頂開始,像遍歷包裝容器參數&cast + emplace到本地函數本地包裝成員容器中。只是想法真的。數學代碼需要相對高效,否則我最終可能會浪費API提供的優化(SIMD指令,霓虹燈等),通過將API類型集合轉換爲封裝類型集合... – codey 2012-04-01 16:11:53

+0

@codey如果平臺可能有一些花哨的優化,比如向量化,你需要非常小心以避免可能會嚇跑優化器的投射。真的,編譯器喜歡你以直接和語義的方式來做事情。如果你的庫可能包含幾個typedef和單行內聯函數,你應該這樣做。如果沒有底層函數需要容器類型,並且用戶不需要它們,爲什麼還要考慮額外的成本和工作量? – Potatoswatter 2012-04-01 16:19:45