У меня есть тип 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
).
Есть ли способ изменить спецификацию импорта для получения правильного вывода?
Недавно я добавил поддержку оборачивания таких вложенных типов в компиляторе. Вам нужно будет использовать последний код из разви ветка. Вот как это можно сделать:
{.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]
введите в тот же модуль.