Why can't I have overloading and generics?
sclytrack
sclytrack at hotmail.com
Sat Mar 10 00:21:30 PST 2012
On 03/10/2012 04:32 AM, Caligo wrote:
> struct B { }
> struct C { }
> struct D { }
>
> struct A {
>
> ref A foo(B item) {
> /* do something special. */
> return this;
> }
>
> ref A foo(T)(T item) if(is(T == C) || is(T == D)) {
> /* nothing special, do the same for C and D. */
> return this;
> }
> }
>
> Is this unreasonable? iirc, C++ supports this, but not D. What's the
> reason? Bug?
>
> What's a good solution to this?
>
> 1. a generic `foo()` that uses `static if`s?
>
> 2. overload `foo()`, even if it means having function bodies that are
> exactly same (code duplication).?
>
> 3. mixin templates? I don't know about this because TDPL says it's
> experimental, and I've tried and I get weird errors.
I don't know what the best solution is. But the following works.
import std.stdio;
struct B { }
struct C { }
struct D { }
struct A {
ref A foo(T)(T item) if (is(T==B)) {
/* do something special. */
writeln("B");
return this;
}
ref A foo(T)(T item) if(is(T == C) || is(T == D)) {
/* nothing special, do the same for C and D. */
writeln("C or D");
return this;
}
}
int main()
{
A a;
B b;
C c;
a.foo(b);
a.foo(c);
writeln("Test");
return 0;
}
-----------------------output
B
C or D
Test
More information about the Digitalmars-d-learn
mailing list