【问题标题】:Wrapping nested templated types in nim在 nim 中包装嵌套的模板类型
【发布时间】:2015-04-08 23:15:39
【问题描述】:

我有一个 C++ 类型,例如:

template <typename T>
class Vector {
  struct Iterator {
  };
};

在 C++ 中,我可以使用 Iterator 作为 Vector&lt;int&gt;::Iterator

如何包装它以从 Nim 使用它? c2nim 发射

type Vector[T] {.importcpp...} = object
  type Iterator[T] {.importcpp...}

因为 nim 没有嵌套类型而无法编译,并且会生成 Vector&lt;T&gt;::Iterator&lt;T&gt; 而不是 Vector&lt;T&gt;::Iterator

我可以在 Nim 中使用非嵌套类型:

type VectorIterator[T] {.importcpp: "Vector::Iterator".}
var v : VectorIterator[cint]

而这自然会产生Vector::Iterator&lt;int&gt;,这是错误的(应该是Vector&lt;int&gt;::Iterator)。

有没有办法改变导入规范以产生正确的输出?

【问题讨论】:

    标签: c++ nim-lang


    【解决方案1】:

    我最近添加了对在编译器中包装此类嵌套类型的支持。您需要使用 devel 分支的最新代码。以下是它的实现方法:

    {.emit: """
    
    template <class T>
    struct Vector {
      struct Iterator {};
    };
    
    """.}
    
    type
      Vector {.importcpp: "Vector".} [T] = object
      VectorIterator {.importcpp: "Vector<'0>::Iterator".} [T] = object
    
    var it: VectorIterator[int]
    

    手册中的相关细节可以在herehere找到。

    【讨论】:

      【解决方案2】:

      我认为在 Nim 中创建嵌套类型没有多大意义,因为最小的封装单元是模块。 所以你应该在同一个模块中创建一个单独的FooBar[T] 类型。

      【讨论】:

      • 如果我想包装Foo::Bar&lt;T&gt;,那就行了。我不知道如何使它与Foo&lt;T&gt;::Bar 一起工作。
      • 一个更具体的示例将有助于理解您的用例。我不确定为什么 Foo::Bar&lt;T&gt;Foo&lt;T&gt;::Bar 之间的区别对你很重要。
      • 更新示例。 Vector::Iterator 使用 Vector 作为命名空间,而 Vector 是一个未实例化的模板,而不是类型或命名空间。在 C++ 中使用未实例化的模板是非法的。然后它使用 Iterator 作为模板,而 Iterator 不是模板,只是模板化类型中的一个类型。 Vector::Iterator 是一个实例化模板中的结构,可以按预期工作。这不是语言的一些奇怪的边缘情况。每个使用过 STL 的人都见过 std::vector::iterator.
      • 在 Nim 中,您只需在模块中添加 iterator items[T](v: Vector[T]): T。没有必要在单独的类中。即使有需要,我认为拥有单独的VectorIterator[T] 类也没有问题。底线是 - 在 Nim 中没有嵌套类型的方法,因为这没有任何意义。因此,您应该针对 C++ 中嵌套类型的情况进行一些重构。
      • 你还是不明白。我想添加一个映射到Vector&lt;T&gt;::Iteratortype VectorIterator[T]。我可以添加一个Vector::Iterator&lt;T&gt;,但这与 C++ 类型不匹配。我无法控制 C++ 类型。我需要知道是否可以设置任何选项,使用特定格式的导入规范,使用{.importcpp.} 将类型映射到Vector&lt;T&gt;::Iterator
      猜你喜欢
      • 1970-01-01
      • 2016-05-07
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 2018-12-08
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多