May 09, 2014
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?
May 09, 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