Функции, принимающие NTuple в качестве аргументов, но накладывающие (статические) ограничения на размер, как их определить? - PullRequest
0 голосов
/ 16 января 2019

Я хочу определить функции, принимающие NTuple в качестве аргументов, но с с ограничениями размера .

Идея состоит в том, чтобы объявить что-то вроде:

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

Однако это неверный код Джулии.

Мой вопрос: как определить такие функции в Юлии?


(только для иллюстрации) : для кодеров C ++ мой вопрос эквивалентен "как перевести этот вид кода C ++

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

в правильно сформированный код Джулии. "

1 Ответ

0 голосов
/ 16 января 2019

В этом конкретном случае вы можете сделать:

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).

...