亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢查類是否具有給定簽名的成員函數。

檢查類是否具有給定簽名的成員函數。

C++
慕容森 2019-06-19 15:48:11
檢查類是否具有給定簽名的成員函數。我要求一個模板技巧來檢測一個類是否具有給定簽名的特定成員函數。這個問題與這里引用的問題相似。http://www.gotw.ca/gotw/071.htm但情況并非如此:在薩特的書中,他回答了一個問題:C類必須提供一個具有特定簽名的成員函數,否則程序將無法編譯。在我的問題中,如果一個類有這個功能,我需要做一些事情,否則我需要做一些“其他的事情”。Boost:序列化也面臨類似的問題,但我不喜歡他們采用的解決方案:默認情況下,模板函數用特定的簽名調用一個空閑函數(必須定義),除非您用特定的簽名定義了一個特定的成員函數(在他們的情況下,“序列化”使用了給定類型的2個參數),否則會發生編譯錯誤。即實現侵入式序列化和非侵入式序列化。我不喜歡這個解決方案有兩個原因:要成為非侵入性的,您必須重寫Boost:序列化命名空間中的全局“序列化”函數,因此您可以在客戶端代碼中打開命名空間Boost和命名空間序列化!解決這個混亂的堆棧是10到12個函數調用。我需要為沒有該成員函數的類定義一個自定義行為,并且我的實體位于不同的名稱空間中(我不想覆蓋在一個名稱空間中定義的全局函數,而我在另一個名稱空間中)你能給我一個解決這個難題的提示嗎?
查看完整描述

3 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

我不確定我是否正確地理解了你,但是你可以利用SFINAE在編譯時檢測函數的存在。代碼中的示例(測試類是否具有成員函數size_t USED_Memory()Const)。

template<typename T>struct HasUsedMemoryMethod{
    template<typename U, size_t (U::*)() const> struct SFINAE {};
    template<typename U> static char Test(SFINAE<U, &U::used_memory>*);
    template<typename U> static int Test(...);
    static const bool Has = sizeof(Test<T>(0)) == sizeof(char);};template<typename TMap>void ReportMemUsage(const TMap& m, std::true_type){
        // We may call used_memory() on m here.}template<typename TMap>void ReportMemUsage(const TMap&, std::false_type)
        {}template<typename TMap>void ReportMemUsage(const TMap& m){
    ReportMemUsage(m, 
        std::integral_constant<bool, HasUsedMemoryMethod<TMap>::Has>());}


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關注
  • 479 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號