digitalmars.D.learn - Using C++ with D / returning a templated type from C++
- =?iso-8859-1?Q?Robert_M._M=FCnch?= (26/26) Jul 04 2018 I have the following C++ code and want to give the D/C++ integration a n...
- vit (2/26) Jul 04 2018 final Array!myClass getArray(); <== !!!!!!!!!!!!!!!!!
- Steven Schveighoffer (7/21) Jul 04 2018 Not sure what this is? ^^
- =?iso-8859-1?Q?Robert_M._M=FCnch?= (26/47) Jul 04 2018 Yes, it's the input to an other function:
- Seb (14/18) Jul 05 2018 Well, if you discover something that isn't covered/mentioned on
- =?iso-8859-1?Q?Robert_M._M=FCnch?= (15/20) Jul 05 2018 It's a big code base... that's a bit the problem why I try to strip
I have the following C++ code and want to give the D/C++ integration a new try: template<typename T> class Array {...} class myClass {...} typedef Array<myClass> myClassArray; myClassArray classA::getArray() noexcept {...} How does the D binding for this look like? I tried something like this: extern (C++) { class Array(T){}; class Array(myClass) {}; class classA { final Array(myClass) getArray(); <== COMPILER ERRORS }; } But this doesn't work at all and give a bunch of comiler errors: Error: function declaration without return type. (Note that constructors are always named this) Error: no identifier for declarator extern (C++) Array(myClass) Error: semicolon expected following function declaration Error: function declaration without return type. (Note that constructors are always named this) Error: no identifier for declarator extern (C++) getArray() Any ideas? -- Robert M. Münch http://www.saphirion.com smarter | better | faster
Jul 04 2018
On Wednesday, 4 July 2018 at 17:32:49 UTC, Robert M. Münch wrote:I have the following C++ code and want to give the D/C++ integration a new try: template<typename T> class Array {...} class myClass {...} typedef Array<myClass> myClassArray; myClassArray classA::getArray() noexcept {...} How does the D binding for this look like? I tried something like this: extern (C++) { class Array(T){}; class Array(myClass) {}; class classA { final Array(myClass) getArray(); <== COMPILER ERRORS }; } But this doesn't work at all and give a bunch of comiler errors: Error: function declaration without return type. (Note that constructors are always named this) Error: no identifier for declarator extern (C++) Array(myClass) Error: semicolon expected following function declaration Error: function declaration without return type. (Note that constructors are always named this) Error: no identifier for declarator extern (C++) getArray() Any ideas?final Array!myClass getArray(); <== !!!!!!!!!!!!!!!!!
Jul 04 2018
On 7/4/18 1:32 PM, Robert M. Münch wrote:I have the following C++ code and want to give the D/C++ integration a new try:     template<typename T> class Array {...}     class myClass {...}     typedef Array<myClass> myClassArray;     myClassArray classA::getArray() noexcept {...} How does the D binding for this look like? I tried something like this:  extern (C++) {You need class myClass somewhere, no?  class Array(T){};   class Array(myClass) {};Not sure what this is? ^^ Note, I would say you need: alias myClassArray = Array!myClass  class classA {     final Array(myClass) getArray(); <== COMPILER ERRORSArray!myClass, not Array(myClass) -Steve
Jul 04 2018
On 2018-07-04 18:04:25 +0000, Steven Schveighoffer said:On 7/4/18 1:32 PM, Robert M. Münch wrote:Yes, it's the input to an other function: extern (C++, myUtils) { final int readFromFile(Destination dst, Array!myClass input, const char* filename); }I have the following C++ code and want to give the D/C++ integration a new try: template<typename T> class Array {...} class myClass {...} typedef Array<myClass> myClassArray; myClassArray classA::getArray() noexcept {...} How does the D binding for this look like? I tried something like this: extern (C++) {You need class myClass somewhere, no?Beside the wrong syntax, I was not sure if I need to instantiate the specific template.class Array(T){}; class Array(myClass) {};Not sure what this is? ^^Note, I would say you need: alias myClassArray = Array!myClassYes, might help.Ah... this is always catching me... because the declaration syntax is different. Thanks, helped a bit. This is the C++ signature: public: static class Array<class myClass> __cdecl builtinCodecs(void) And this is now the D version: public: class Array<class myClass> __cdecl builtinCodecs(void) __ptr64 So, the only difference left is the C++ static and the additional __ptr64 (whatever this is) on the D side. Any further ideas? BTW: IMO the docs should show very complex examples taking classes, typedefs, templates etc. into account and not only show for simple basic types. That's OK to get the concept but this C++ interface thing needs a ton of examples how to do things to be really useable. So, how or where could such a collection be done? -- Robert M. Münch http://www.saphirion.com smarter | better | fasterclass classA { final Array(myClass) getArray(); <== COMPILER ERRORSArray!myClass, not Array(myClass)
Jul 04 2018
On Thursday, 5 July 2018 at 06:35:01 UTC, Robert M. Münch wrote:So, the only difference left is the C++ static and the additional __ptr64 (whatever this is) on the D side. Any further ideas?Could you post your current C++ and D files?So, how or where could such a collection be done?Well, if you discover something that isn't covered/mentioned on the specification, it can even go to the spec: https://dlang.org/spec/cpp_interface.html Otherwise, I think the C++ interface isn't really mentioned to the DTour, so it could be worthwhile to add a page there and content can be more informal there: https://github.com/dlang-tour/english Otherwise, just plain markdown documents in a GitHub repo are pretty popular these days. Alternatively, there's still the DWiki too. BTW if you (or someone) has a few good examples, I think the DBlog would be more than happy about an article.
Jul 05 2018
On 2018-07-05 08:14:18 +0000, Seb said:On Thursday, 5 July 2018 at 06:35:01 UTC, Robert M. Münch wrote:It's a big code base... that's a bit the problem why I try to strip things down. Maybe this is better: https://pastebin.com/dpQdAPye This is the demangled form from the C++ link library: public: static class b2d::Array<class b2d::ImageCodec> __cdecl b2d::ImageCodec::builtinCodecs(void) With the D compiler I was able to generates these manglings: public: class b2d::Array<class b2d::ImageCodec> * __ptr64 __cdecl b2d::ImageCodec::builtinCodecs(void) __ptr64 public: class b2d::Array<class b2d::ImageCodec> __cdecl b2d::ImageCodec::builtinCodecs(void) __ptr64 -- Robert M. Münch http://www.saphirion.com smarter | better | fasterSo, the only difference left is the C++ static and the additional __ptr64 (whatever this is) on the D side. Any further ideas?Could you post your current C++ and D files?
Jul 05 2018