FPC has a number of function pointer types and eventually will have another in "reference to" closures. This presents a problem of how the programmer can make a function that is type agnostic so that we can use different types of callbacks.
Currently this is the best solution I can think of but it's still a real mess and tedious to setup. Here's a little snippet of a list class that has a Sort method. It feels to me like the compiler needs a new type which wraps all the callbacks for us but maybe there's a better way? ======================================== type generic TSList<T> = class type TComparator = record private type TFuncProc = function (constref left, right: T; context: pointer): integer; TFuncNested = function (constref left, right: T; context: pointer): integer is nested; TFuncObject = function (constref left, right: T; context: pointer): integer of object; private index: TFuncType; public function Call(constref left, right: T; context: pointer): integer; case byte of 0: (proc: TFuncProc); 1: (nested: TFuncNested); 2: (obj: TFuncObject); end; ... procedure Sort(callback: TComparator.TFuncProc; context: pointer = nil); procedure Sort(callback: TComparator.TFuncNested; context: pointer = nil); procedure Sort(callback: TComparator.TFuncObject; context: pointer = nil); end; ... procedure TSList.Sort(callback: TComparator.TFuncProc; context: pointer); var comparator: TComparator; begin comparator.proc := callback; comparator.index := TFuncType.IsProc; { do sorting and call comparator.Call(left, right, context); which routes to the correct callback } end; Regards, Ryan Joseph _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal