

整数を素因数分解する関数 factorize() を作ろうとしていて  
テンプレートの使い方で詰まっています。

factorize() を以下のように作りました。

[code]

    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;
    }
    
[/code]

ここで引数 n を int に制限するのではなく long でも使いたいと考えています。  
しかし、int に収まる場合は int で計算して欲しいです。  
そのためにテンプレートを使いました。

[code]

    T[] factorize(T)(T n) {
        // 略
    }
    
[/code]

実行するとうまく動作しているように見えます。

[code]

    writeln(factorize(30)); // [2, 3, 5]
    writeln(factorize(2L^^35).length); // 35
    
[/code]

しかし、const 値を渡すとコンパイルエラーになります。

[code]

    const n = 12;
    writeln(factorize(n)); // コンパイルエラー(cannot modify const expression n)
    
[/code]

定数なので値を変更できないのが理由なので  
いったん変数で受けたいのですが書き方がわからないです。

この場合、テンプレート引数をどのように書けばよいでしょうか？


CC BY-SA 4.0
2018-12-23T03:15:57.833
51452
2018-12-23T03:15:57.833
13856
question
d
int または long 型となるテンプレート引数の書き方