7

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

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

在 C++ 中,我可以使用Iteratoras Vector<int>::Iterator

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

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

它不会编译,因为 nim 没有嵌套类型,并且会生成Vector<T>::Iterator<T>而不是Vector<T>::Iterator.

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

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

这自然会产生Vector::Iterator<int>,这是错误的(应该是Vector<int>::Iterator)。

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

4

2 回答 2

6

我最近添加了对在编译器中包装此类嵌套类型的支持。您需要使用来自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]

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

于 2015-04-13T23:17:25.320 回答
0

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

于 2015-04-09T12:27:31.210 回答