我怎样才能让Eclipse对我的模板参数做出假设?

时间:2016-08-11 20:40:24

标签: templates ide eclipse-cdt indexer

我有

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

我只用T实例化它,它是Bar的子类。如果它有帮助,我可以static_assert就是这种情况。

因此,Eclipse CDT不承认T“真的”也是Bar。我不能抱怨 - 但我可以使明白吗?也就是说,我可以以某种方式告诉索引器在类Bar中查找方法和类型作为Foo的基类吗?

1 个答案:

答案 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获得更好的自动完成功能将成为后续功能。