簡體   English   中英

該指針從虛擬成員函數傳遞到模板

[英]this pointer passed to template from a virtual member function

我有一個在基類A中實現的虛函數。此函數中有一個循環。 派生類B可用,但不會覆蓋虛擬函數,因為任何派生類的代碼都相同。

好吧,但是,我需要根據類類型(基類或派生類)調用該虛函數(local_policy)內的其他條件檢查。 現在,我可以實現另一個虛擬成員函數,並在派生類中重寫它,但是當調用發生在循環內部時,應將虛擬開銷降至最低,因此我認為我寧願使用函數模板並將其專門用於任何派生類。

現在的問題是我正在從foo()內部傳遞* this指向函數模板的指針,並且從未調用過專門化。 在這種情況下,this指針是A類型而不是B類型嗎? 我猜不是,我的專用功能模板將被調用。

感謝您的幫助!

template < typename T >
bool local_policy(const T* mtype) { return true; }

class A
{
   public: 
   virtual void foo()
   {
      for(..) { 
         if(local_policy(this)) //This will call the non-specialised template! Why?
         { /* do something */ }
      }
   }
   /* [...] */
}

class B : public A
{         
   /* [...] */
   //foo() is not overridden here
}

//Specialize the function template for class B
template <>
bool local_policy(const B* mtype) { return false; }

main()
{
   B* test = new B; if(!B) return;
   test->foo(); 
}

提前致謝! 最好

PS:我還嘗試了一些C ++ 11,它們使用常規函數和帶有std :: enable_if的全局模板來僅在它是派生類時才啟用。 沒關系,也沒有我所期望的那樣。 : - /

C ++不允許基於參數類型的動態分派-函數重載解析始終基於表達式的靜態類型。 在你的榜樣,靜態類型的this具有永遠是A * ,即使它指向在B ,所以你的專門的功能不會被調用。

如果要動態分配,則必須使用虛函數,並且只能基於this參數動態分配,而不能基於任何其他參數動態分配。 如果您擔心開銷,可以將動態調用取消循環,僅調用一次:

virtual bool local_policy() { return true; }
virtual void foo() {
    bool policy = local_policy();
    for (..) {
        if (policy) {
            /* do something */
        }
    }
}

編譯器永遠無法獨自進行優化,因為它不知道您永遠也不會定義派生類來覆蓋local_policy函數並產生副作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM