в С? Грязно, но возможно с макро-магией. (Кстати, C ++ - лучший выбор).
#define DECL_MATRIX(type,name) \
typedef struct matrix_##type##_t { \
type **matrix; \
size_t x; \
size_t y; \
} name; \
name alloc_##name(size_t x,size_t y)
#define DEFINE_MATRIX_OPS(type,name) \
struct matrix_##type##_t \
alloc_##name(size_t x, size_t y) { \
size_t i; \
struct matrix_##type##_t ret; \
type **m; \
\
m = (type **)malloc(x*sizeof(type *)); \
for(size_t i=0;i<x;i++) \
m[i] =(type *) malloc(y*sizeof(type)); \
ret.x=x; \
ret.y=y; \
ret.matrix=m; \
return ret; \
}
Вы бы тогда использовали это так:
// At the top level of the file
DECL_MATRIX(double, dmat);
DECL_MATRIX(int, imat);
DEFINE_MATRIX_OPS(double, dmat);
DEFINE_MATRIX_OPS(int, imat);
// In a function
dmat d = alloc_dmat(3,3);
imat i = alloc_imat(2,6);
Как заметка разработчика, для матриц фиксированного размера лучше выделять память для элементов в виде одного блока и использовать небольшую математику для индексации в них. Таким образом, вместо ary[a][b]
вы используете ary[a*x_size+y]
. Вы можете обернуть все это в большее количество макросов, если хотите, но это гораздо более эффективно, как с точки зрения управления памятью, так и доступа.