C ++: макрос Variadic для списка аргументов шаблона не работает - PullRequest
0 голосов
/ 31 января 2019

Я хочу создать переменный макрос, в котором я могу написать «gen (X, Y, Z)» вместо шаблона .

Если я закомментирую gen_3macro vs говорит, что расширение «gen (X, Y, Z)» будет «gen_3 (X, Y, Z)», что хорошо.Но если я не прокомментирую, что расширение - это "template ", что явно плохо.Так что я не понимаю, что здесь происходит.Что я пропустил?

#define CAT( A, B ) A ## B
#define SELECT( NAME, NUM ) CAT( NAME ## _, NUM )
#define COMPOSE( NAME, ARGS ) NAME ARGS

#define GET_COUNT( _0, _1, _2, _3, _4, _5, _6 /* ad nauseam */, COUNT, ... ) COUNT
#define EXPAND() ,,,,,, // 6 commas (or 7 empty tokens)
#define VA_SIZE( ... ) COMPOSE( GET_COUNT, (EXPAND __VA_ARGS__ (), 0, 6, 5, 4, 3, 2, 1) )

#define VA_SELECT( NAME, ... ) SELECT( NAME, VA_SIZE(__VA_ARGS__) )(__VA_ARGS__)

#define gen(...) VA_SELECT( gen, __VA_ARGS__ )

#define gen_0() template<>
#define gen_1(A) template<typename A>
#define gen_2(A, B) template<typename A, typename B>
#define gen_3(A, B, C) template<typename A, typename B, typename C>
#define gen_4(A, B, C, D) template<typename A, typename B, typename C, typename C>

template<typename A, typename B, typename C> //original
struct S0
{
};

gen(X, Y, Z) //new //does not work :(
struct S1
{};

int main()
{
}
...