2015-08-27 91 views
0

KDE/PIM Zanshin項目在其代碼中的許多位置使用std :: mem_fn,事實證明至少有1個版本的Apple鏗鏘聲(隨OS X 10.9提供的最新Xcode附帶的聲明)會生成無法鏈接多個相關文件的目標代碼。創建一個通用的包裝,返回std :: mem_fn或boost :: mem_fn

事實證明,通過使用boost::mem_fn而不是std::mem_fn可以規避該問題。該項目的主要作者並不傾向於增加對所有平臺的增強依賴性,所以我提出了一個補丁,其中使用了一個條件宏,在需要時可擴展到boost::mem_fn

請求現在是創建一個生活在殘心自己的命名空間中的一個(Utils::mem_fn(f))模板的功能和返回要麼std::mem_fn(f)boost::mem_fn(f)。這是高於我目前的薪酬水平的部分......或者,這根本不可行,因爲我幾乎不理解mem_fn函數的用途。

所以問題是:有沒有一個容易,緊湊的方式來包裝std::mem_fn,理想情況下與一個單一的模板功能?

主要障礙似乎是返回類型,但由於zanshin代碼中的所有用法似乎返回歸結爲函數指針,我嘗試使用返回類型void*。我預計會失敗,事實上它確實如此。

+0

澄清:「boost依賴」是「必須安裝boost以構建項目」的簡寫,而不是爲了建議運行時依賴。我認爲「他」更喜歡在OS X上增加對boost的依賴關係的原因是我們很可能在這裏處理編譯器錯誤。所以這個問題應該自己解決;不使用boost :: mem_fn,意味着代碼將繼續使用std :: mem_fn。 – RJVB

回答

1

「該項目的主要作者沒有傾斜,以增加在所有平臺上的提升依賴」

所以他反而與負擔不一致相關的項目?聽起來很歪曲。

另外,它並不是平臺特定意義上的依賴項,因爲您可以簡單地在代碼庫中包含相關頭文件(請參閱BCP),並且首先不存在相關的運行時依賴項。

也就是說,更簡單的選擇將是一個包裝std::mem_fn和相同的練習(的地址)引用成員的包裝。這樣,聯動問題實際上應該消失。

最簡單的事情將是(C++ 14):

template <typename PTMorPTMF> 
    auto my_mem_fn(PTMorPTMF const& ptm) { 
     return std::mem_fn(ptm); 
    } 

如果你堅持用C++ 11:

template <typename PTMorPTMF> 
    auto my_mem_fn(PTMorPTMF const& ptm) -> decltype(std::mem_fn(ptm)) { 
     return std::mem_fn(ptm); 
    } 

簡單的#ifdef實施,你應該結束了通過一個平臺的提升來實現它。

+0

這很有趣:鏈接錯誤實際上是以「decltype」開始,接着是大量的crud,某處明確指出std :: mem_fn是實際缺少的函數。 我會嘗試你的建議;似乎要麼它會允許我完全擺脫boost :: mem_fn,否則我應該能夠使用包裝std :: mem_fn或boost :: mem_fn的條件表單。 – RJVB

+0

本來是太好了:[鏈接錯誤](https://paste.kde.org/p5gnjwaih) – RJVB

+0

我同意你可以基於std :: bind而不是boost :: mem_fn來做你自己的事情。沒有任何附加代碼,鏈接器錯誤就沒有意義。我不知道你在試圖指出鏈接器錯誤。 – sehe

相關問題