Может быть, с использованием decltype()
и std::integral_constant
?
Я имею в виду ... вы можете объявить (только объявить: не нужно его определять) следующую функцию (РЕДАКТИРОВАТЬ: модифицировано, следуя предложению Дэвиса Херринга)(спасибо!), чтобы принять константные ссылки; это позволяет работать также с не копируемыми типами)
template <typename ... Args>
std::integral_constant<std::size_t, sizeof...(Args)> CArgs (Args const & ...);
и использовать его, например
#define bar(num, ...) \
static_assert(num == decltype(CArgs(__VA_ARGS__))::value);
Таким образом, вы не можетеиспользуйте значения __VA_ARGS__
в static_assert()
, но тип, возвращаемый функцией, которая принимает __VA_ARGS__
.
И возвращаемый тип (std::integral_constant<std::size_t, sizeof...(Args)>
) содержит число (доступно через ::value
),в качестве константы времени компиляции аргументов.
Ниже приведен полный пример компиляции
#include <type_traits>
template <typename ... Args>
std::integral_constant<std::size_t, sizeof...(Args)> CArgs (Args const & ...);
#define bar(num, ...) \
static_assert(num == decltype(CArgs(__VA_ARGS__))::value);
int main()
{
int x = 0;
int& xRef = x;
//..VV number of the following arguments
bar(3u, x, xRef, 42);
}