【问题标题】:How can I get Eclipse to make assumptions about my template parameters?如何让 Eclipse 对我的模板参数做出假设?
【发布时间】:2016-08-11 20:40:24
【问题描述】:

我有

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

我只用Ts 实例化它,它们是Bar 的子类。如果有帮助,我可以 static_assert 就是这样。

因此,Eclipse CDT 无法识别 T 是“真的”也是 Bar。我不能抱怨——但我可以它理解吗?也就是说,我能否以某种方式告诉索引器在Bar 类中查找方法和类型作为Foo 的基类?

【问题讨论】:

    标签: templates ide eclipse-cdt indexer


    【解决方案1】:

    这是一个非常好的问题!

    目前,没有办法告诉 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 中的概念支持。利用概念实现更好的自动完成功能将成为后续功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      相关资源
      最近更新 更多