В машинописи, как написать функцию для обработки произвольного размерного массива (например ::Array<number>,Array<Array<number>>, …)?

В C ++ я могу написать шаблонную функцию:

#include <stdio.h>
#include <vector>
template <typename V>
void f(V& v){
for(auto& e : v){
f(e);
}
printf("\n");
}

template <>
void f(int& v){
printf("%d ",v);
}

обрабатывать любые размеры вектора в векторе (например: вектор< Int>, вектор< вектор< INT >>, вектор< вектор< вектор< INT >>>, …):

int main(){
std::vector<int> v1={1,2};
f(v1);
std::vector<std::vector<int> > v2={{3,4},{5,6,7}};
f(v2);
return 0;
};

такой тип функции, как это:

let v1 : Array<number>=[1,2];
f<Array<number>>(v1);

let v2 : Array<Array<number>>=[[3,4],[5,6,7]];
f<Array<Array<number>>>(v2);

также возможно в машинописи? Я пытаюсь что-то вроде:

f<V>(v : V){
for(let e in v){
this.f(e);
}
}

f<>(v : number){
}

но ошибка говорит

Duplicate function implementation.

и я верю, что могу ошибиться

1

Решение

В C ++ вы полностью специализируете шаблон функции.
В любом случае, дженерики в машинописи больше похожи на дженерики в Java или C #, не очень похожи на шаблоны в C ++.
Вы не можете определить полные специализации.

0

Другие решения

Вы можете иметь только одну функцию с одинаковым именем, поэтому вам нужно согласовать обе части в одной и той же функции. В этом случае простой проверки для массива должно быть достаточно.

f(v: any)
{
if (Array.isArray(v))
for (let e in v)
this.f(e);
else
doSomething(v);
}
0

По вопросам рекламы [email protected]