Just use Zig?
In zig, genericMax([]i32) would emit seperate code to genericMax([]i16). This proposal has both of those functions backed by the same symbol and machine code but it requires a bunch of extra arguments, virtual function calls, and manualy offsetting indices into arrays. You could use zig to do the same with some effort.
fn genericReduceTypeErased(
size: usize,
total: [*]u8,
list: []const u8,
reducer: *const fn(total: [*]u8, current: [*]const u8) callconv(.C) void,
) void {
for(0..@divExact(list.len, size)) |i| {
const itm = &list[i \* size];
reducer(total, @ptrCast(itm));
}
}
inline fn genericReduce(
comptime T: type,
total: *T,
list: []const T,
reducer: *const fn(total: *T, current: *const T) callconv(.C) void,
) void {
genericReduceTypeErased( @sizeOf(T), @ptrCast(total), std.mem.sliceAsBytes(list), @ptrCast(reducer) );
}
The proposal is basically syntax sugar for making a typed version of the first function in CThe point is not to use something else, but to improve what they already use
I'm not convinced this specific proposal does that, but that's a separate matter. JenHeyd Meneide has a Technical Specification paper for a defer statement in C, which is visibly based on Zig's version, and I applaud that.
https://thephd.dev/just-put-raii-in-c-bro-please-bro-just-on...