如何为Julia的Foo{S,T}编写仅传t参数、初始化空v的参数化构造函数?
解决方法
要为Foo{S, T}编写通用的参数化构造函数,让它仅接收t的值并将v初始化为空的Vector{S},可以通过以下两种方式实现:
1. 支持指定完整类型参数的构造函数
定义一个带类型参数的外部构造函数,匹配任意S和T:
struct Foo{S, T} v::Vector{S} t::T end # 通用参数化构造函数 Foo{S, T}(t::T) where {S, T} = Foo{S, T}(Vector{S}(), t)
这样你就可以为任意S和T类型调用该构造函数:
# 创建Foo{Int, String}实例,v为空Int数组 f1 = Foo{Int, String}("hi") # 创建Foo{Float64, Bool}实例,v为空Float64数组 f2 = Foo{Float64, Bool}(true)
注意:原示例中使用[]初始化v会创建Vector{Any}类型,无法直接赋值给Vector{S}字段,因此改用Vector{S}()来创建正确类型的空数组。
2. 简化版构造函数(仅指定S类型)
如果希望只指定S类型,让T从t的类型自动推断,可以添加另一个构造函数:
Foo{S}(t::T) where {S, T} = Foo{S, T}(Vector{S}(), t)
使用方式更简洁:
# T自动推断为String,创建Foo{Int, String} f3 = Foo{Int}("hello") # T自动推断为Char,创建Foo{Char, Char} f4 = Foo{Char}('a')
这两种构造函数覆盖了通用场景,既支持显式指定所有类型参数,也允许部分类型推断,满足不同的使用需求。
内容的提问来源于stack exchange,提问作者Frank Seidl
相关产品推荐
相关产品推荐

