int または long 型となるテンプレート引数の書き方
整数を素因数分解する関数 factorize() を作ろうとしていて
テンプレートの使い方で詰まっています。
factorize() を以下のように作りました。
int[] factorize(int n) {
assert(n > 0);
if (n == 1) return [1];
int[] ps;
while (n % 2 == 0) {
ps ~= 2;
n /= 2;
}
for (int i = 3; i * i <= n; i += 2) {
while (n % i == 0) {
ps ~= i;
n /= i;
}
}
if (n > 1) ps ~= n;
return ps;
}
ここで引数 n を int に制限するのではなく long でも使いたいと考えています。
しかし、int に収まる場合は int で計算して欲しいです。
そのためにテンプレートを使いました。
T[] factorize(T)(T n) {
// 略
}
実行するとうまく動作しているように見えます。
writeln(factorize(30)); // [2, 3, 5]
writeln(factorize(2L^^35).length); // 35
しかし、const 値を渡すとコンパイルエラーになります。
const n = 12;
writeln(factorize(n)); // コンパイルエラー(cannot modify const expression n)
定数なので値を変更できないのが理由なので
いったん変数で受けたいのですが書き方がわからないです。
この場合、テンプレート引数をどのように書けばよいでしょうか?