А раз такая пьянка, то в принципе-то, возникает полноценное метапрограммирование.

Кроме параметров типов для объявления структур (записей) необходимы либо "ассоциированные типы" (как в ML-лях) -- ниже статейка с их обоснованием в Rust:
http://rurust.github.io/rust_book_ru/src/associated-types.html

Либо можно воспользоваться "дискриминантом" типа по мотивам как в Ada, когда параметры типа (их имена) доступны также, как и поля записи (к тому же техника "ассоциированных типов" востребована в случае наличия "классов типов" или их аналогов в виде всяких trait-ов и осуществления "инстанцирования" класса/trait-а для типа):
## Код:
```
// Пусть параметры задаются как дискриминант в Ada --
// в обычных скобках, чтобы меньше пугать "дженериками":
type MyRec(Elem: type; Size: integer) = pointer to record
    data: array Size of Elem; 
end;
...
// Объявление обобщённой процедуры (метода),
// где "а" передаётся по ссылке (компилятор
// при потребности и возможности может передавать и по значению):
procedure (t: MyRec) any_proc(in a: t.Elem);

// Объявление переменной:
var rec: MyRec(integer, 10);
```

И, в целом, желательно двигаться в сторону некой "упрощённой Ada", как было отмечено здесь в смежной теме. Тем более:
http://www.ethoberon.ethz.ch/native/compiler/x.operators.html
## Код:
```
PROCEDURE "+"* (a, b: ARRAY OF CHAR): ARRAY OF CHAR; 
     VAR  res: ARRAY LEN(a) + LEN(b) + 1 OF CHAR; i, j: LONGINT; 
     BEGIN 
          i := 0; 
          WHILE a[i] # 0X DO  res[i] := a[i]; INC(i)  END; 
          j := 0; 
          WHILE b[j] # 0X DO  resij] := b[j]; INC(i); INC(j)  END; 
          res[i] := 0X; 
          RETURN res 
     END "+";
```

Это примерчик из расширения OberonX. Есть подозрение, что res, всё-таки, статический массив на "резиновом" стеке в стиле Ada.

В общем-то, вот такой бред в качестве альтернативы "шаблонной магии".