opApply and const

anonymous via Digitalmars-d digitalmars-d at puremagic.com
Fri May 9 03:59:18 PDT 2014


On Friday, 9 May 2014 at 05:26:12 UTC, Arne Ludwig wrote:
> Hello,
>
> when using opApply it seems natural to have two versions: one 
> normal and one const. My problem is that I cannot find a way to 
> describe both versions with one code block. Since there could 
> be a number of basic variants with different numbers of 
> delegate arguments this can lead to serious code duplication.
>
> This problem was discussed years ago:
>
> http://www.digitalmars.com/d/archives/digitalmars/D/opApply_and_const_63436.html
>
> Small example:
>
> http://pastebin.com/kRrPp6Yg
>
> In that example I need four times (mostly) the same code. There 
> should be any way around that. Has someone ideas?

I answered a similar question on stackoverflow [1]. The same
approach can be used here.

If dg doesn't mutate, the mutable overloads are de-facto const.
So, if you have a const dg, it's safe to cast the object's const
away and call the mutable versions of opApply:

    /* de-facto const if dg doesn't mutate */
    int opApply(int delegate (T*) dg) {
      ... implementation ...
    }

    /* ditto */
    int opApply(int delegate (size_t, T*) dg) {
      ... implementation ...
    }

    int opApply(int delegate(const T*) dg) const {
      return (cast() this).opApply(cast(int delegate(T*)) dg);
    }

    int opApply(int delegate (size_t, const T*) dg) const {
      return (cast() this).opApply(cast(int delegate(size_t, T*))
dg);
    }

[1]
http://stackoverflow.com/questions/22442031/how-to-make-a-template-function-const-if-the-template-is-true/22442425


More information about the Digitalmars-d mailing list