在 nim 中包装嵌套的模板化类型
Wrapping nested templated types in nim
我有一个像这样的 C++ 类型:
template <typename T>
class Vector {
struct Iterator {
};
};
在 C++ 中,我可以将 Iterator
用作 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
)。
有没有办法更改导入规范以生成正确的输出?
我认为在 Nim 中创建嵌套类型没有多大意义,因为最小的封装单元是模块。
所以你应该在同一个模块中创建一个单独的 FooBar[T]
类型。
我最近添加了对在编译器中包装此类嵌套类型的支持。您需要使用 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]
我有一个像这样的 C++ 类型:
template <typename T>
class Vector {
struct Iterator {
};
};
在 C++ 中,我可以将 Iterator
用作 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
)。
有没有办法更改导入规范以生成正确的输出?
我认为在 Nim 中创建嵌套类型没有多大意义,因为最小的封装单元是模块。
所以你应该在同一个模块中创建一个单独的 FooBar[T]
类型。
我最近添加了对在编译器中包装此类嵌套类型的支持。您需要使用 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]