www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Exporting Templates in Static Libraries

reply lkd <lkd_member pathlink.com> writes:
Hi, I'm wondering is it possible to export templates in an static library using
the export commands? Do I need a factory function like a class does?

Thanks
Mar 11 2005
parent reply "Ben Hinkle" <ben.hinkle gmail.com> writes:
"lkd" <lkd_member pathlink.com> wrote in message 
news:d0ta3g$rg6$1 digitaldaemon.com...
 Hi, I'm wondering is it possible to export templates in an static library 
 using
 the export commands? Do I need a factory function like a class does?

 Thanks

Do you mean a template instance? A template itself is not stored in object code. Assuming you do mean template instance I would guess the rules are the same as if the code hadn't been in a template. But I don't know for sure. Can you give more details about what you are trying to do?
Mar 12 2005
parent reply lkd <lkd_member pathlink.com> writes:
In article <d0vblr$4ha$1 digitaldaemon.com>, Ben Hinkle says...
"lkd" <lkd_member pathlink.com> wrote in message 
news:d0ta3g$rg6$1 digitaldaemon.com...
 Hi, I'm wondering is it possible to export templates in an static library 
 using
 the export commands? Do I need a factory function like a class does?

 Thanks

Do you mean a template instance? A template itself is not stored in object code. Assuming you do mean template instance I would guess the rules are the same as if the code hadn't been in a template. But I don't know for sure. Can you give more details about what you are trying to do?

Yeah, I'm just basically making a simple array template to Redim 2D, 3D, and 4D arrays. I'm trying to compile the following code into a library and use a module that just has the interface to access it. Source: module arr; template Arr(T) { //1D Array T[] Redim(int elems) {T arr[] = new T[elems]; return arr;} //2D Array T[][] Redim(int rows, int cols) { T arr[][]; arr.length = rows; for(int i = 0; i < rows; i++) { arr[i].length = cols; } return arr; } //3D Array T[][][] Redim(int x, int y, int z) { T arr[][][]; arr.length = x; for(int i = 0; i < y; i++) { arr[i].length = y; for(int j = 0; j < z; j++) { arr[i][j].length = z; } } return arr; } } Interface: module arr; template Arr(T) { //1D Array T[] Redim(int elems); //2D Array T[][] Redim(int rows, int cols); //3D Array T[][][] Redim(int x, int y, int z); } Will this work?
Mar 12 2005
parent reply Ben Hinkle <Ben_member pathlink.com> writes:
Do you mean a template instance? A template itself is not stored in object 
code. Assuming you do mean template instance I would guess the rules are the 
same as if the code hadn't been in a template. But I don't know for sure. 
Can you give more details about what you are trying to do? 

Yeah, I'm just basically making a simple array template to Redim 2D, 3D, and 4D arrays. I'm trying to compile the following code into a library and use a module that just has the interface to access it.

Will this work?

Not as written. The template body has to be imported as well (by analogy in C++ a template has to be in the header files) so that the user's code can instatiate the template. If you don't want to expose the template body you can either instantiate the template with some types and expose those instances or you can write some backend routines that aren't exposed and have the exposed template call those routines. I think the simplest solution for your example is to leave the template as it is and import the source and forget about the interface module. That is keeping with D's single-source model unless there are reasons to go to a body/interface model. -Ben
Mar 12 2005
parent lkd <lkd_member pathlink.com> writes:
In article <d0vu8f$na8$1 digitaldaemon.com>, Ben Hinkle says...
Do you mean a template instance? A template itself is not stored in object 
code. Assuming you do mean template instance I would guess the rules are the 
same as if the code hadn't been in a template. But I don't know for sure. 
Can you give more details about what you are trying to do? 

Yeah, I'm just basically making a simple array template to Redim 2D, 3D, and 4D arrays. I'm trying to compile the following code into a library and use a module that just has the interface to access it.

Will this work?

Not as written. The template body has to be imported as well (by analogy in C++ a template has to be in the header files) so that the user's code can instatiate the template. If you don't want to expose the template body you can either instantiate the template with some types and expose those instances or you can write some backend routines that aren't exposed and have the exposed template call those routines. I think the simplest solution for your example is to leave the template as it is and import the source and forget about the interface module. That is keeping with D's single-source model unless there are reasons to go to a body/interface model. -Ben

Had a feeling that wouldn't work. I'll just keep the source. Thanks.
Mar 13 2005