如何实现一个运行时可变参数的类型

我要实现二次域整数,类似 ie + ir*\sqrt{c} 的形式
但是,类型构造函数我希望能把c当作类型参数输入进去,因为,
这些整数在进行加减乘运算的时候,需要确保参与运算的c是一样的值
而c值是在运行时候确定的

需要类似

struct Quadticnumber {T <: Integer, c}
    re:: T
    ir::T
end

这种形式,T是整数类型,c是一个有值的变量,怎么写能达到要求?

然后我能初始化

x = Quadticnumber{Int64, 3}(1,2)

也能初始化

y = Quadticnumber{Int64, c}(1, -1)

其中的c由复杂运算得到

如果你需要在运行时改变c,那么你直接创建新的object就可以了,不需要(也不应该)改变类型参数。

struct Quadtic{T <: Integer, C} <: Integer
   re::T 
   ir::T  
end

然后例如定义乘法 (随便写的,结果时错的,明白意思就行)

Base.:(*)(x::Quadic{T, C1}, y::Quadic{T, C2}) where {T, C1, C2} = Quadic{T, C1 + C2}(blablabla)

这里C没必要使用可变参数,因为这个整数如果只用Int64,只会占用128个byte,直接创建新的object就行了。实际上大部分整数本身就是immutable,运算的时候直接创建新的object而不是修改原来的值了。

其次,如果你不需要对不同的C派发特别的函数,那么这里使用类型参数并不是很好的做法,处理增加编译器负担以外你不会得到多少性能提升。不如直接声明为动态的

struct Quadtic{T <: Integer}
    re::T 
    ir ::T 
    c :: T 
end

你给的这个case里我看不到任何声明成类型参数的必要性。

谢谢你的回复,我需要的整数是大整数,所以开销还是很大的,另外不是要针对不同的C,而是要确保C相同

mutable struct Quadtic{T <: Integer, C} <: Integer
   re::T
   ir::T
end

function qfmul(l:: Quadtic{T, C}, r:: Quadtic{T, C}) where {T <: Integer, C}
    tmp = Quadtic{T, C}(0, 0)
    tmp.re = l.re * r.re + l.ir * r.ir * C
    tmp.ir = l.re * r.ir + l.ir * r.re
    return tmp
end

l = Quadtic{BigInt, 5}(1, 1)
r = Quadtic{BigInt, 5}(1, -1)
t = Quadtic{BigInt, 5}(0, 0)
t = qfmul(l, r)
println(t)

那你应当用 @assert 来检查C是否相等,把C放在类型参数在你这个例子里不会带来多少性能提升。

并且再次重申一遍:你不需要使用C来派发不同的函数,并且C的内存布局是确定的。所以没有必要放在类型参数里。

为了好看啊,逃~,

而且,你看我不是知道了新东西了么?