包装nim中的嵌套模板化类型



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

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

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

我该如何包装才能从尼姆那里使用它?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)。

是否有办法更改导入规范以产生正确的输出?

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

手册中的相关详细信息可在此处和此处找到。

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

最新更新