这是一个非常好的问题!
目前,没有办法告诉 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 的成员作为自动完成建议。模板。
Concepts 目前由 GCC 支持,其他编译器(例如 MSVC 和 clang)正在努力实现它。
Bug 492682 跟踪 Eclipse CDT 中的概念支持。利用概念实现更好的自动完成功能将成为后续功能。