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

dha*_*nan 5 c++ nim-lang

我有一个类似的C++类型:

template <typename T>
class Vector {
  struct Iterator {
  };
};
Run Code Online (Sandbox Code Playgroud)

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

如何将它包装起来以便从Nim中使用它?c2nim发出

type Vector[T] {.importcpp...} = object
  type Iterator[T] {.importcpp...}
Run Code Online (Sandbox Code Playgroud)

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

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

type VectorIterator[T] {.importcpp: "Vector::Iterator".}
var v : VectorIterator[cint]
Run Code Online (Sandbox Code Playgroud)

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

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

zah*_*zah 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]
Run Code Online (Sandbox Code Playgroud)

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