struct opCast to void* and back

Robert Clipsham robert at octarineparrot.com
Sun Apr 11 08:19:50 PDT 2010


On 11/04/10 16:02, Nrgyzer wrote:
> Because I call MyClass.cb by using an other class... for example the
> Button-Class.
....
> For example... I click on a button on my OpenGL-gui, then I simply
> call the pressButton-method in my class Button which should call
> MyClass.cb with callBackValue which can be a value, class, struct or
> a similar datatype. To store different values/classes/structs... I
> cast all to a void-pointer. In this case I can use the Button-class
> in multiple situations.

By using templated classes you can remove the need for void*:
----
struct MyStruct {
          char[] structName;
          public char[] toString() {
                  return structName;
          }
}

class MyClass {
	public static Button!(MyStruct)[] loadButtons() {		
		Button!(MyStruct)[] buttons;	
		for (int i=0; i<  10; i++) {
			
			MyStruct curStruct = MyStruct();
			curStruct.structName = .toString(i);

			buttons ~= new Button!(MyStruct)(cb, curStruct);

		}
		return buttons;
	}

          public static void cb(MyStruct value) {
                  writefln(value);
          }
}

class Button(T) {
          private static void function(T) callBack;
          private static T callBackValue;
	this(void function(T) cB, T cbValue) {
		callBack = cB;
		callBackValue = cbValue;
	}

	public void pressButton() {
		// This should call MyClass.cb
		callBack(callBackValue);
	}
}
----
Of course this is more restrictive in some cases, such as if you wanted 
an array of buttons with different types for their callback and 
callbackValue, and it also adds template bloat if you have a lot of 
different types for buttons. There should be a way around this, I can't 
think of it off the top of my head though, perhaps someone else can.



More information about the Digitalmars-d mailing list