digitalmars.D.learn - Problems using 'with' statement
- Adam S (20/20) Jan 04 2014 I've encountered an issue using the 'with' statement. Can anyone
- bearophile (5/8) Jan 04 2014 Perhaps because "test" is not a member variable name. It's a
- Adam S (16/36) Jan 04 2014 Most template member funs seems to work fine. The issue only
- bearophile (8/23) Jan 04 2014 with() was designed and created to access fields of structs in a
I've encountered an issue using the 'with' statement. Can anyone explain why the following requires that I explicitly specify the variable name, even though it is within a 'with'? class Foo { auto test(alias val)() if (is(typeof(val) == int)){} auto test(alias val)() if (!is(typeof(val) == int)){} } void main() { auto bar = new Foo; with (bar) { //test!2(); //fails to compile //test!"cats"(); //fails to compile bar.test!2(); //works bar.test!"cats"(); //works } } The commented out lines fail with: Error: need 'this' for 'test' of type 'pure nothrow safe void()' Thanks
Jan 04 2014
Adam S:I've encountered an issue using the 'with' statement. Can anyone explain why the following requires that I explicitly specify the variable name,Perhaps because "test" is not a member variable name. It's a (templated) class method. Bye, bearophile
Jan 04 2014
On Saturday, 4 January 2014 at 20:56:41 UTC, Adam S wrote:I've encountered an issue using the 'with' statement. Can anyone explain why the following requires that I explicitly specify the variable name, even though it is within a 'with'? class Foo { auto test(alias val)() if (is(typeof(val) == int)){} auto test(alias val)() if (!is(typeof(val) == int)){} } void main() { auto bar = new Foo; with (bar) { //test!2(); //fails to compile //test!"cats"(); //fails to compile bar.test!2(); //works bar.test!"cats"(); //works } } The commented out lines fail with: Error: need 'this' for 'test' of type 'pure nothrow safe void()' ThanksMost template member funs seems to work fine. The issue only seems to appear when the member function is overloaded. For example class Foo { auto test(alias val)() if (is(typeof(val) == int)){} //auto test(alias val)() if (!is(typeof(val) == int)){} } void main() { auto bar = new Foo; with (bar) { test!2(); //works } } works fine until the overload of test is uncommented. Then the same error occurs.
Jan 04 2014
Adam S:Most template member funs seems to work fine. The issue only seems to appear when the member function is overloaded. For example class Foo { auto test(alias val)() if (is(typeof(val) == int)){} //auto test(alias val)() if (!is(typeof(val) == int)){} } void main() { auto bar = new Foo; with (bar) { test!2(); //works } } works fine until the overload of test is uncommented. Then the same error occurs.with() was designed and created to access fields of structs in a simpler way. In D also enum and class members are usable with with(). Your use case seems a corner case of a usage pattern that was not included. So perhaps you have to write an enhancement request. Bye, bearophile
Jan 04 2014