假設我有兩個項目。一個是應用程序,另一個是共享庫,其中包含可被不僅僅是該應用程序使用的通用可重用代碼。圍繞共享庫邊界的C++接口設計
我的應用程序使用STL,而我的共享庫也使用STL。這裏的第一個問題是我的共享庫正在使用STL。如果我將STL的新版本構建到我的應用程序中,但由於沒有必要重建我的共享庫,那麼我們將立即出現兼容性問題。
我首先想到解決這個問題是在共享庫類的接口中根本不使用STL。假設我們的庫中有一個函數,它接受一個字符串並對它執行一些操作。我會做的函數原型的樣子:
void DoStuffWithStrings(char const* str);
代替:
void DoStuffWithStrings(std::string const& str);
對於字符串這可能將是不同的版本STL之間確定,但不足之處是,我們從std::string
去,到char*
,然後回到std::string
,這看起來會導致性能問題。
將原始類型的裝箱/拆箱推薦給他們的STL同行嗎?當我們嘗試這樣做到std::list
時,這變得更糟,因爲實際上沒有「原始類型」,我意識到我們可以輕鬆地通過它,因爲沒有進行某種類型的O(n)或類似的操作。
什麼樣的設計在這種情況下效果最好?每個的優點/缺點是什麼?
與C的兼容性不是唯一的擔憂,也不是一個很好的經驗法則恕我直言。正如您所說,如果需求不能保證共享庫將始終由應用程序構建,但完全不被C使用,那麼您仍然需要考慮兼容性問題。 C++擁有非常薄弱的共享庫支持(與.NET和C#相比),所以我總是努力保證兼容性在任何可能的情況下都不會成爲問題,無論需求如何。對於'std :: vector'和'std :: map',我認爲我們能做的最好的事情莫過於將它們映射到用戶類型。 –
是的條件應該更像「如果你不需要C並且能夠控制所有庫」。 – stijn