関数

「型Tはその前に<T>があるとジェネリック型になる」というルールは関数に対しても当てはまります。

Using generic functions sometimes requires explicitly specifying type parameters. This may be the case if the function is called where the return type is generic, or if the compiler doesn't have enough information to infer the necessary type parameters.

型パラメータを明示したうえでの関数呼び出しの構文はfun::<A, B, ...>()のようになります。

struct A;          // 具象型`A`
struct S(A);       // 具象型`S`
struct SGen<T>(T); // ジェネリック型`SGen`

// 以下の関数は全て変数の所有権をとった後すぐにスコープを抜けて
// 変数をメモリ上から開放します。

// `S`という型の引数`_s`をとる`reg_fn`という関数を定義。
// `<T>`がないのでジェネリック関数ではありません。
fn reg_fn(_s: S) {}

// `gen_spec_t`という関数を定義。これは`A`という型を与えられた`SGen<T>`
// という型の引数`_s`を取ります。関数名の直後に`<A>`という型パラメータでAが
// ジェネリックであることを明示していないので、この関数はAをジェネリック型
// としては取りません
fn gen_spec_t(_s: SGen<A>) {}

// `gen_spec_i32`という関数を定義。
// これは明示的な型パラメータとして`i32`を与えられた
// `SGen<i32>`型の引数`_s`を取ります。
// この関数もジェネリックではありません。
fn gen_spec_i32(_s: SGen<i32>) {}

// `generic`という関数を定義。`SGen<T>`という型の引数`_s`を取ります。
// `<T>`が`SGen<T>`に先行しているため、これはTに対してジェネリックな関数です。
fn generic<T>(_s: SGen<T>) {}

fn main() {
    // ジェネリックでない関数を使用します。
    reg_fn(S(A));          // 具象型
    gen_spec_t(SGen(A));   // 型パラメータ`A`を暗黙のうちに受け取ります。
    gen_spec_i32(SGen(6)); // 型パラメータ`i32`を暗黙のうちに受け取ります。

    // 型パラメータ`char`を明示的に`generic()`に渡します。
    generic::<char>(SGen('a'));

    // 型パラメータ`char`を暗黙的に`generic()`に渡します。
    generic(SGen('c'));
}

参照

関数, 構造体