我有
template <typename T> class Foo : public T { /* ... */ }
我只用T
实例化它,它是Bar
的子类。如果它有帮助,我可以static_assert就是这种情况。
因此,Eclipse CDT不承认T“真的”也是Bar
。我不能抱怨 - 但我可以使明白吗?也就是说,我可以以某种方式告诉索引器在类Bar
中查找方法和类型作为Foo
的基类吗?
答案 0 :(得分: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原则上可以做出推断,允许它在{{1}类型的对象上调用方法时提供Bar
成员作为自动完成提议在模板里面。
概念目前由GCC支持,其他编译器如MSVC和clang正致力于实现它。
Bug 492682跟踪Eclipse CDT中的Concepts支持。利用Concepts获得更好的自动完成功能将成为后续功能。