Switch constants

Dmitry Olshansky dmitry.olsh at gmail.com
Sat Nov 13 15:05:44 PST 2010


On 14.11.2010 1:21, bearophile wrote:
> In a not-ranged cases body, like in the program below (that doesn't compile), the switch variable is a compile-time constant, so why doesn't the compile see x as constant there?
>
Well, there is fall-through ;) And there still could be goto's.
In essence "case x:" is nothing but a glorified local label.
> template Foo(uint x) {
>      static if (x<= 1)
>          enum Foo = 1;
>      else
>          enum Foo = x * Foo!(x - 1);
> }
>
> int bar(uint x) {
>      switch (x) {
>          case 0: return Foo!x;
>          case 1: return Foo!x;
>          case 2: return Foo!x;
>          case 3: return Foo!x;
>          case 4: return Foo!x;
>          default: return -1;
>      }
> }
>
> void main() {
>      assert(bar(4) == 24);
> }
>
>
> That code works if I replace lines like:
> case 2: return Foo!x;
>
> With:
> case 2: return Foo!2;
>
> But when the code isn't DRY bugs may happen...
> (There are ten different better ways to write that program, but this is not the point).
>
> Bye,
> bearophile


-- 
Dmitry Olshansky



More information about the Digitalmars-d-learn mailing list