wite/pass 在 ziglang 中键入泛型函数的惯用方式

Idiomatic way to wite/pass type to generic function in ziglang

这是我的实际问题的简化版本,但希望能以简洁的方式展示我的问题。

我的问题是关于 printKeys 的接口。我必须将要打印的数据类型作为 comptime 参数传入,最简单的方法是在调用它时在地图上使用 @TypeOf

来自 C++,这似乎有点不雅,无法推断类型,尽管我也喜欢明确。

是否有更惯用的方式在 zig 中使用不需要在调用时使用 @TypeOf 的通用函数,或者一般来说有更好的方式来执行此操作?

const std = @import("std");

fn printKeys(comptime MapType: type, data: MapType) void {

    var iter = data.keyIterator();
    while (iter.next()) | value | {
        std.debug.print("Value is {}\n", .{value.*});
    }
}

pub fn main() !void {
    const allocator = std.heap.page_allocator;
   
    var map = std.AutoHashMap(i32, []const u8).init(allocator);
    defer map.deinit();

    try map.put(10, "ten");
    try map.put(12, "twelve");
    try map.put(5, "five");

    printKeys(@TypeOf(map), map);
}

使用anytype。您可以在 zig docs (Ctrl + F) 中找到更多示例并搜索 anytype

fn printKeys(data: anytype) void {
    ...
}

pub fn main() !void {
    ...
    printKeys(map);
}