ヨーキョクデイ

いろいろ雑食

テンプレート引数のデフォルト値の位置

std.randomCommonType!(T1, T2) uniform(string boundaries = "[)", T1, T2)(T1 a, T2 b); のようなけしからんテンプレート関数が存在する件。ドキュメントでは末尾のテンプレート引数にはデフォルト値を指定できますとされておるわけだが。それ、引数リストの末尾から連続してないし。仕様に反してるし。と思ったけど、次のコードを考える。

import std.stdio;

void main(){
    void unko(T, int k = 666, U)(T a, U b){
        writeln(typeid(T), " ", typeid(U));
    }
    unko(-1, 2u);  // int uint
}

これは unko(-1, 2u); の時点で TU が定まって、void unko(int k = 666)(int a, uint b); と同等になるはずなので許容なのかもしれないと考えれば自然か。
さらに、

import std.stdio;

template Unko(T, int k = 666, U){
    T t;
    U u;
    auto v = k;
}

void main(){
    mixin Unko!(ulong, 3, byte);
    writeln(typeid(typeof(t)), " ", typeid(typeof(u)), " ", v);  // ulong byte 3
}

ということも同じ考え方で受け入れられる気がする。
結局、見た目上はどこにデフォルト値の指定が来ようが関係ないということですか。ただ、インスタンス化の時点でその位置より後ろが適切に定まっている必要があるだけであって。
通常の関数とは違うわけですね。

import std.stdio;

void main(){
    void f(int a = 2, int b){  // コンパイルエラー
        writeln(a * b);
    }
    f(4, 9);
}

もういや。