const-typed class does not have const members
Ali Çehreli
acehreli at yahoo.com
Fri Jan 21 16:52:25 PST 2011
Sean Eskapp wrote:
> The following code yields results as commented.
>
> import std.stdio;
>
> class A
> {
> int b;
> }
>
> void main()
> {
> const A a = new A;
> writeln(typeof(a).stringof); // const(A)
> writeln(typeof(a.b).stringof); // const(int)
>
> writeln((const A).stringof); // const(A)
> writeln(typeof((const A).b).stringof); // int
> }
>
> Given this information, how do I work around this in templates? I'd
like a
> template which can type its params based on members of T, for instance:
>
> void foo(T)(T x, typeof(T.member) y)
>
> but this will yield non-const second parameters even if T is const.
Help anybody?
Ironically, parameter list is not a useful place to constraint the
parameter types. At the least, you probably want some conversions. If
so, would this work:
import std.traits;
void foo(T, M)(T x, M m)
if (isImplicitlyConvertible!(M, typeof(T.member)))
{}
class C
{
int member;
}
void main()
{
auto c = new C;
foo(c, 42);
}
If you want to ensure that the member is assignable, you can try this:
import std.traits;
void foo(T, M)(T x, M m)
if (__traits(compiles, { x.member = m; }))
{}
class C
{
int member;
}
void main()
{
const auto c = new C; // <-- compilation error
foo(c, 42);
}
But the error message is only somewhat helpful:
deneme.d(26369): Error: template deneme.foo(T,M) if
(__traits(compiles,delegate ()
{
x.member = m;
}
)) does not match any function template declaration
deneme.d(26369): Error: template deneme.foo(T,M) if
(__traits(compiles,delegate ()
{
x.member = m;
}
)) cannot deduce template function from argument types !()(const(C),int)
Ali
More information about the Digitalmars-d-learn
mailing list