2015-04-08 13 views
5

mi hanno un tipo C++ come:Wrapping tipi su modelli annidati in NIM

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

E in C++ posso usare Iterator come Vector<int>::Iterator.

Come si impacchetta per usarlo da Nim? c2nim emette

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

che non compilato perché NIM non ha nidificati tipi, e produrrebbe Vector<T>::Iterator<T> anziché Vector<T>::Iterator.

posso usare tipi non nidificati in Nim:

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

E questo produce naturalmente Vector::Iterator<int>, che è sbagliato (dovrebbe essere Vector<int>::Iterator).

C'è un modo per modificare le specifiche di importazione per produrre l'output corretto?

risposta

4

Ho recentemente aggiunto il supporto per il wrapping di tali tipi nidificati nel compilatore. Dovrai utilizzare l'ultimo codice dal ramo devel. Ecco come si può fare:

{.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] 

I relativi dettagli nel manuale si possono trovare here e here.

0

Penso che non abbia molto senso creare tipi nidificati in Nim, perché l'unità minima di incapsulamento è modulo. Quindi dovresti semplicemente creare un tipo FooBar[T] separato nello stesso modulo.

+0

Che funzionerebbe se volessi avvolgere 'Foo :: Bar '. Non so come farlo funzionare con 'Foo :: Bar'. – dhasenan

+0

Un esempio più concreto potrebbe aiutare a capire il tuo caso d'uso. Non sono sicuro del motivo per cui la differenza tra "Foo :: Bar " e "Foo :: Bar" è importante per te. – endragor

+0

Esempio aggiornato. Vector :: Iterator utilizza Vector come spazio dei nomi e Vector è un modello non giustificato, non un tipo o uno spazio dei nomi. È illegale utilizzare modelli non confermati in C++. Quindi utilizza Iterator come modello e Iterator non è un modello, ma solo un tipo all'interno di un tipo di modello. Vector :: Iterator è una struttura all'interno di un modello istanziato e funziona come previsto. Questo non è uno strano caso limite della lingua; chiunque abbia lavorato con STL ha visto un std :: vector :: iterator. – dhasenan