以NTuple为参数但施加(静态)大小限制的函数,如何定义它们?

时间:2019-01-16 12:43:37

标签: static julia

我想使用NTuples作为参数定义函数,但要使用大小限制

想法是声明类似以下内容的

foo(x::NTuple{K-1,Int},y::NTuple{K,Int}) where {K} = "ok"

但这不是正确的Julia代码。

我的问题是:如何在Julia中定义此类功能?


(仅出于说明目的):对于C ++编码人员,我的问题等同于“如何翻译这种C ++代码

template <size_t N>
foo(const std::array<int, N-1>& x, const std::array<int, N>& y) 
{ ... }

转换为格式正确的Julia代码。”

1 个答案:

答案 0 :(得分:5)

在这种情况下,您可以执行以下操作:

foo(x::NTuple{M,Int},y::Tuple{Int, Vararg{Int,M}}) where {M} = "ok"

因为尺寸上的差异是固定的。

在更一般的情况下,我唯一了解的就是在函数内部添加条件:

foo(x::NTuple{M,Int},y::NTuple{K,Int}) where {M,K} = 
    M + 1 == K ? "ok" : throw(ArgumentError("dimension mismatch"))

,条件检查应该由编译器优化(至少在这种情况下,它似乎在Julia 1.0.3下进行了优化)。