Идентичный вариативный макрос, который пробрасывает токены без изменений и часто используется для принудительной развёртки в цепочках макросов.
#include <scl/utility/preprocessor/forward.h>#define SCL_FORWARD(...) __VA_ARGS__Макрос не создаёт рантайм‑накладных расходов; работает только на этапе препроцессирования.
#include <scl/utility/preprocessor/forward.h>
// Проброс аргументов функции
#define CALL(fn, ...) fn(__VA_ARGS__)
int add(int a, int b) { return a + b; }
int result = CALL(add, SCL_FORWARD(1, 2)); // -> add(1, 2)
// Форсирование развёртки макроса, выдающего список типов
#define BASIC_TYPES int, long, double
template <typename... Ts>
struct type_list {};
using TL = type_list<SCL_FORWARD(BASIC_TYPES)>; // -> type_list<int, long, double>
// Цепочка макросов, производящих токены через запятую
#define MAKE_PAIR(a, b) a, b
using P = std::pair<SCL_FORWARD(MAKE_PAIR(int, double))>; // -> std::pair<int, double>
// Проброс аргументов через промежуточный макрос
#define FORWARD_TO_EMPLACE(obj, ...) obj.emplace_back(__VA_ARGS__)
std::vector<std::pair<int, std::string>> v;
FORWARD_TO_EMPLACE(v, SCL_FORWARD(42, "answer")); // -> emplace_back(42, "answer")