Присоединение первых n-1 аргументов в макросе - PullRequest
0 голосов
/ 06 июля 2018

Мне нужно написать макрос, который выглядит следующим образом

MACRO(one, name, "some string");

Если у макроса есть n аргументов, мне нужно иметь возможность объединить первые n-1 аргументы вместе с подчеркиванием. Например, приведенный выше вызов расширится до

std::string one_name{"some string"};

Точно так же, если бы у меня было что-то подобное

MACRO(one, two, name, "some string");

Я должен получить

std::string one_two_name{"some string"};

Возможно ли это?


Отказ от ответственности : я не могу отказаться от использования макроса для этого.

1 Ответ

0 голосов
/ 06 июля 2018

С жестко заданным лимитом вы можете сделать:

#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...)    N
#define COUNT(...)   COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
// Warning: COUNT() return 1 (as COUNT(A)) :-/

#define IDENTITY(N) N
#define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))

#define F_1(_) static_assert(false, "Not enough argument")
#define F_2(a, s) std::string a = s;
#define F_3(a, b, s) std::string a ## _ ## b = s;
#define F_4(a, b, c, s) std::string a ## _ ## b ## _ ## c= s;
#define F_5(a, b, c, d, s) std::string a ## _ ## b ## _ ## c ## _ ## d= s;
#define F_6(a, b, c, d, e, s) std::string a ## _ ## b ## _ ## c ## _ ## d ## _ ## e = s;
#define F_7(a, b, c, d, e, f, s) std::string a ## _ ## b ## _ ## c ## _ ## d ## _ ## e ## _ ## f= s;
#define F_8(a, b, c, d, e, f, g, s) std::string a ## _ ## b ## _ ## c ## _ ## d ## _ ## e ## _ ## f ## _ ## g = s;

#define DISPATCH(N) F_ ## N

#define Macro(...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(__VA_ARGS__)

Демо

...