Не получается заставить работать «склейку», чтобы избавиться от последнего элемента:
#define CAT(left, right) CAT_EXP(left, right)
#define CAT_EXP(left, right) left ## right
#define HEAD(seq) HEAD_EXP1 seq)
#define HEAD_EXP1(x) x HEAD_EXP2(
#define HEAD_EXP2(x)
#define TAIL(seq) TAIL_EXP seq
#define TAIL_EXP(x)
#define ITER(seq) func(HEAD(seq)) ITER0(TAIL(seq))
#define ITER0(seq) ITER1 seq
#define ITER1(seq) ,func(seq) ITER2
#define ITER2(seq) ,func(seq) ITER1
#define ITER1_END
#define ITER2_END
ITER((a) (b) (c) (d) (e) (f))
На выходе, разумеется, это:
func(a) ,func(b) ,func(c) ,func(d) ,func(e) ,func(f) ITER2
Никак не получается присобачить ##, чтобы приклеить к концу _END
Пробовал так:
#define ITER(seq) func(HEAD(seq)) ITER0(TAIL(seq)) ## _END
#define ITER(seq) func(HEAD(seq)) CAT(ITER0(TAIL(seq)), _END)
Кто мне может подсказать, как мне аки прилепить к концу _END? Или в более широком вопросе - мне нужно проитерировать элементы так, чтобы в конце не было запятой.