Debug help - opDispatch - unknown member function

Brother Bill brotherbill at mail.com
Tue Sep 9 11:52:55 UTC 2025


On Tuesday, 9 September 2025 at 01:24:59 UTC, monkyyy wrote:
>
> ```d
> import std;
> struct Vector(int N,T,string fields){
> 	static foreach(I;0..N){
> 		mixin("T "~fields[I]~";");
> 	}
> 	auto opDispatch(string __s__)(){//I suggest a habit of 
> avoiding simple names when generating mixin code
> 		return mixin((){
> 			string output="tuple(";
> 			foreach(C;__s__){
> 				output~=C;
> 				output~=',';
> 			}
> 			output~=")";
> 			return output;
> 		}());
> 	}
> }
> unittest{
> 	Vector!(3,int,"xyz") foo;
> 	foo.x=5;
> 	foo.y=3;
> 	foo.yx.writeln;
> 	Vector!(4,ubyte,"rgba") bar;
> 	bar.bgr.writeln;
> }
> ```

I simplified your example, and manually expanded opDispatch so D 
newbies can grok it.
Please explain the opDispatch IIFE and why no semicolon needed at 
the end.

```
import std;

// Comment out yx() xor opDispatch()

struct Vector(int N, T, string fields){
	int x;
	int y;
	int z;

	// manual expansion of opDispatch
	// auto yx() {
	// 	string output = "tuple(";
	// 	foreach (char scv; "yx") {
	// 		output ~= scv;
	// 		output ~= ",";
	// 	}
	// 	output ~= ")";
	// 	writeln(output);			// This is not in opDispatch()
	// 	return tuple(3, 5);         // Hack to return same result
	// }

	// I suggest a habit of avoiding simple names when generating 
mixin code
	auto opDispatch(string __s__)() {  // IIFE
		writeln("__s__: ", __s__);

		return mixin(() {
			string output = "tuple(";
			foreach (C; __s__){
				output ~= C;
				output ~= ',';
			}
			output ~= ")";
			return output;
		} ());
	}
}

void main() {
	Vector!(3, int, "xyz") foo;
	foo.x = 5;		// Standard assignment to known member
	foo.y = 3;		// Standard assignment to known member
	foo.yx.writeln;	// yx not a member of Vector, so opDispatch is 
called
}}
```

Console output:
```
__s__: yx
Tuple!(int, int)(3, 5)
```


More information about the Digitalmars-d-learn mailing list