Writing closed source programs in D?
Maxim Fomin
maxim at maxim-fomin.ru
Mon Jun 3 11:53:22 PDT 2013
On Friday, 31 May 2013 at 15:35:54 UTC, Jonathan M Davis wrote:
> The situation with templates is basically the same as it is
> with C++. They
> have to go in the interface/header file and always will.
> There's no way around
> that, because the code importing the header/interface file
> actually needs the
> full definition. If the compiler supported some sort of
> intermediate format,
> then you could provide partially compiled templates, but pretty
> much all of
> the information would still have to be there (just in a less
> human readable
> format), and you can't even partially compile much of a
> template without the
> arguments to instantiate it with anyway. So, you'd pretty much
> just be putting
> the same template definition in a binary format instead of
> text, which wouldn't
> stop much of anyone from figuring out what they looked like.
>
> - Jonathan M Davis
Actually dmd for code importing module doesn't need full
definition, it only inserts symbols referring to external object
files. This allows to split template declaration and definition
with restriction that module with template definition emits
referred symbols (which restricts applicability since due to
separate compilation model it is impossible to know beforehand
template parameters). This also can be viewed as 'linker'
template constraint, if you pass not expected parameters you will
have link error.
import foo;
import std.stdio;
class Me : BiiA
{
override void foo()
{
writeln("main");
}
}
void main()
{
BiiA b = new Me;
b.foo();
b.get();
}
--- foo.di-------
template bar(T, U)
{
U baz();
class A(T)
{
T t;
T get();
void foo();
}
}
alias bar!(int, int) Bii;
alias Bii.A!int BiiA;
---foo.d ----
import std.stdio;
template bar(T, U)
{
U baz();
class A(T)
{
T t;
T get()
{
writeln("foo");
return t;
}
void foo()
{
writeln("foo");
}
}
}
alias bar!(int, int) Bii;
alias Bii.A!int BiiA;
-----
dmd main.d // Error undefined reference to ...
dmd main.d foo.o //works
./main
main
foo
More information about the Digitalmars-d-learn
mailing list