2016-08-11 70 views
2

如何讓Eclipse對我的模板參數進行假設?

template <typename T> class Foo : public T { /* ... */ } 

,我只用T,這種是Bar子類實例化。如果有幫助,我可以static_assert是這種情況。

所以,Eclipse CDT不承認T是「真」也是Bar。我不能抱怨 - 但我可以使它明白嗎?也就是說,我可以通過某種方式告訴索引器尋找類Bar中的方法和類型作爲Foo的基類嗎?

回答

0

這是一個非常好的問題!

目前,沒有辦法告訴Eclipse模板只會被具有特定類型的子類的參數實例化。

但是,有一個即將到來的C++語言功能,可以讓你在代碼中表達這種關係,並讓Eclipse也可以接受:Concepts

概念讓你約束模板參數,使得他們必須滿足概念,它可以被看作是一個類型謂詞 - 對類型布爾函數,在編譯時進行評估。

例如,你可以寫這樣一個概念:

template <typename T> 
concept bool DerivedFromBar = std::is_base_of<Bar, T>::value; 

定義一個概念DerivedFromBar是滿意的只有由從Bar派生類型。

然後可以使用這個概念在類模板定義:

template <DerivedFromBar T> class Foo : public T { /* ... */ } 

注意使用DerivedFromBar而不是通常的typename申報模板參數T。這告訴編譯器T被約束爲滿足DerivedFromBar

一旦以這種方式表達代碼,Eclipse可以在原則上進行推理,以便在模板內部調用T類型的對象時爲其提供Bar成員作爲自動完成建議。

概念目前支持GCC,其他編譯器如MSVC和鏗鏘正在努力實現它。

Bug 492682跟蹤Eclipse CDT中的概念支持。利用概念實現更好的自動完成功能將成爲後續功能。

相關問題