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);
}
这是我的实际问题的简化版本,但希望能以简洁的方式展示我的问题。
我的问题是关于 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);
}