На самом деле вы можете частично обойти это. Вы можете напрямую и свободно извлекать каждый элемент ни __VA_ARGS__
, ни вариационные шаблоны C ++ 11. Но у вас может быть самый первый элемент. Например, предположим, что у нас есть макрос с именем OUT(...)
, и мы хотим создать std :: cout & lt; A & lt; B & lt; C ... где A, B, C - вариационные аргументы макроса. Попробуйте следующее:
#include <iostream>
#define SEPERATOR <<
#define GET_1_OF(element1, ...) element1
#define GET_2_OF(element1, ...) element1 SEPERATOR GET_1_OF(__VA_ARGS__)
#define GET_3_OF(element1, ...) element1 SEPERATOR GET_2_OF(__VA_ARGS__)
#define BAR(...) GET_3_OF(__VA_ARGS__)
int main()
{
std::cout << BAR(1,2,3,4,5);
return 0;
}
Это, конечно, не решение, которое вам нужно. Но вы можете увеличить число GET_N_OF, чтобы делать то, что вы хотите. Обратите внимание, что SEPERATOR
- <<
, так что мы можем MACRO писать 1 << 2 << 3
и так далее. Теперь у нас есть проблема в этом коде. Измените BAR(1,2,3,4,5)
на BAR(1)
. Вы увидите, что он дает ошибку. Это связано с тем, что он ожидал 3 аргумента, хотя не имеет смысла иметь больше аргументов (потому что это переменный), у нас есть дополнительные SEPERATOR
. Поэтому для решения этой проблемы вместо использования BAR(...)
используйте GET_N_OF(...)
(поскольку вы знаете количество аргументов):
#include <iostream>
#define SEPERATOR <<
#define GET_1_OF(element1, ...) element1
#define GET_2_OF(element1, ...) element1 SEPERATOR GET_1_OF(__VA_ARGS__)
#define GET_3_OF(element1, ...) element1 SEPERATOR GET_2_OF(__VA_ARGS__)
#define GET_4_OF(element1, ...) element1 SEPERATOR GET_3_OF(__VA_ARGS__)
#define GET_5_OF(element1, ...) element1 SEPERATOR GET_4_OF(__VA_ARGS__)
int main()
{
std::cout << GET_5_OF(1,2,3,4,5);
std::cout << GET_1_OF(1);
return 0;
}
Обратите внимание, что если вы не знаете, что делаете, не использовать MACROs вообще! Мой ответ состоял в том, чтобы поделиться интересным кодом MACRO, который может быть полезен для вас. Я всегда препятствую использованию МАКРО до тех пор, пока они не станут чрезвычайно необходимыми.