auto & class members

Steven Schveighoffer schveiguy at yahoo.com
Mon May 21 18:55:36 UTC 2018


On 5/20/18 1:46 PM, Robert M. Münch wrote:
> On 2018-05-20 17:40:39 +0000, Robert M. Münch said:
> 
>> Hi Jonathan, great! This got me a step further. So I can declare my 
>> member now. But I get an implict cast error when I try:
>>
>> class a {
>>     ... myStream;
>> }
>>
>> class b {
>>     typeof(a.myStream.filter!(x => x == myMessage)) mySubStream;
>> }
>>
>> void myFunc() {
>>     a myA = new a();
>>     b myB = new b();
>>
>>     myB.mySubstream = myA.myStream.filter!(x => x == myMessage);
>> }
>>
>> This gives (unnecessary stuff stripped):
>>
>> Error: cannot implicitly convert expression filter(...) of type 
>> app.myFunc.filter!(x => x == myMessage) to app.b.filter!(x => x == 
>> myMessage)
> 
> Answering myself: Using an alias helps.
> 
> alias typeof(a.myStream.filter!(x => x == myMessage)) myMessageType;

So the issue here is that the lambda function inside myFunc is DIFFERENT 
than the one inside b. They are both the same function, but with 
essentially different names.

When you use the alias, both are using the same exact lambda.

I see you are casting now as well, which looks horrible to me -- if you 
change something in your lambda now you are in for some trouble.

What may make more sense (both for type sanity and for code reuse) is to 
wrap your call to filter into one place so it can be used wherever you 
need it:

auto wrapStream(S)(S str) { return str.filter!(x => x == myMessage); }

class b
{
    typeof(wrapStream(a.init.myStream)()) mySubStream;
}

void myFunc() {
    a myA = new a;
    b myB = new b;
    myB.mySubstream = myA.myStream.wrapStream;
}

-Steve


More information about the Digitalmars-d-learn mailing list