Использование расширений GNU.
В C у меня есть это:
#define is_same_type(a, b) \
__builtin_types_compatible_p(__typeof__(a), __typeof__(b))
#define is_array(a) (!is_same_type((a), &(a)[0]))
#define Static_assert_array(a) \
_Static_assert(is_array(a), "Not a `[]` !")
Это правильно статически утверждает, что что-то является массивом.
Однако в g ++, нет __builtin_types_compatible_p()
.
В g ++ у меня было следующее:
#define Static_assert_array(a) \
static_assert(std::is_array <__typeof__(a)>::value, "Not a `[]`!")
Но когда я попытался использовать его с VLA, я обнаружил, если он не поддерживает VLA:
test.c:10:39: error: ‘int [n]’ is a variably modified type
10 | return std::is_array <__typeof__(vla)>::value;
| ^
test.c:10:39: error: trying to instantiate ‘template<class> struct std::is_array’
Есть ли способ заставить этот макрос работать с VLA?