template <typename T> class Foo : public T { /* ... */ }
,我只用T
,這種是Bar
子類實例化。如果有幫助,我可以static_assert是這種情況。
所以,Eclipse CDT不承認T是「真」也是Bar
。我不能抱怨 - 但我可以使它明白嗎?也就是說,我可以通過某種方式告訴索引器尋找類Bar
中的方法和類型作爲Foo
的基類嗎?
template <typename T> class Foo : public T { /* ... */ }
,我只用T
,這種是Bar
子類實例化。如果有幫助,我可以static_assert是這種情況。
所以,Eclipse CDT不承認T是「真」也是Bar
。我不能抱怨 - 但我可以使它明白嗎?也就是說,我可以通過某種方式告訴索引器尋找類Bar
中的方法和類型作爲Foo
的基類嗎?
這是一個非常好的問題!
目前,沒有辦法告訴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中的概念支持。利用概念實現更好的自動完成功能將成爲後續功能。