Как static_assert, что что-то является массивом (включая VLA)? - PullRequest
1 голос
/ 26 апреля 2020

Использование расширений 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?

...