How to create a template class using foreach delegate to filter objects in a member function call?

Alex sascha.orlov at gmail.com
Sat Jun 1 04:43:13 UTC 2019


On Friday, 31 May 2019 at 16:24:28 UTC, Robert M. Münch wrote:
> The code is just to show the problem and not meant to compile. 
> I couldn't get anything to compile...

That's ok, but could you provide an example anyway? Is it like 
this?

´´´
void main(){
     auto target = new myClass!int();
     target.objects.length = 4;
     auto val = 42;
     put(target, val, testfunction); // does the test function 
enters here?
     put(target, val);
     auto f = myFilter!int; // where do you want to use this 
entity?
}
´´´

>> Said this, I for myself had a similar problem. I solved this 
>> by reversing the hierarchy: I templated my objects I wanted to 
>> use the filter on with the filter function and removed the 
>> need of the template parameter inside the filter.
>
> The thing is, myClass is not under my control. It's coming from 
> a library I don't maintain and I don't want to mess around with 
> the code or if, as minimalistic as possible. That's why I was 
> thinking about providing a put(T)... function.

*

>
> My first idea was to sub-class myClass, but objects is private, 
> so no chance to get access to it.
>
>> You could still write a general filter function in this case, 
>> if you want. For example, you could use mixins for this...
>
> Then myClass needs to somehow get the mixin in.
>
> So, to summarize the problem: Given a class that manages an 
> array of things as an OutputRange how can I provide a put() 
> function with something like a filter-predicate? I only want to 
> put() to some of the things, not all.

Do you have control about the contained classes? If so, it is a 
hint to implement the testing inside them. Like:

/* probably inside a templated mixin */
bool testfunction(inputs){...}

class myOtherClass(/*probably templated*/){... mixin testfunction 
... & provide a put function}

* So, you are not totally against the idea of modifying the 
foreign library, but you want to keep modifications small? With 
the approach now, you could, for example, handle compile time 
blocks inside the put function in the myClass and dynamical ones 
inside the myOtherClasses.

class myClass(E){/* inserted put function */ void put(...){static 
if put action is at all possible --> put. }}


More information about the Digitalmars-d-learn mailing list