Может ли C реализовать массив типов?

#c #c 17

#c #c 17

Вопрос:

Вот так:

 typeArray type[2] = {uint8_t, uint16_t};
for (int i=0; i < 2; i  )
{
    myFunction<type[i]>();
}
  

Я думаю, что это невозможно реализовать, потому что это нарушает некоторые правила в C . Но я не уверен, и я не знаком с новыми функциями C (11 14 17 и т.д.). так что кто-нибудь может сказать мне ответ?

Более конкретно.

 \ Such as I have a template functon "PrintSecondTypeLen"
template<typename Type>PrintSecondTypeLen(unsigned int *a)
{
    Type *b;
    b = (Type *) a;
    std::cout << *(b 1) << std::endl;
}
\ Then suppose that I have a typeArray.
typeArray type[2] = {uint8_t, uint16_t}; \ It's wrong, just for example.

\ Then I use it:
unsigned int a[2] = {0x56575859, 0x46474849};
for (int i=0; i < 2; i  )
{
    PrintSecondTypeLen<type[i]>(a);
}
  

Комментарии:

1. Вам нужно быть более конкретным. Какие операции вы хотите, чтобы массив поддерживал? Вы можете использовать что-то вроде using type_list = std::tuple<uint8_t, uint16_t>; вместо массива и перебирать его, но вы не можете изменять такой список во время выполнения.

2. Как насчет простого массива указателей некоторого суперкласса и последующего вызова переопределенного метода из объекта, который вы сохраняете?

3. @Aziuth Я реализую функцию smilar с помощью указателя на функцию, теперь, когда мы должны определить тип значения, я просто реализую все типы функций, которые я буду использовать, затем сохраняю их в массиве указателей на функции, затем я использую индекс для вызова этих массивов. Конечно, тип входных параметров должен быть одинаковым, но у меня нет лучшего способа.

Ответ №1:

В C типы не являются первоклассными значениями во время выполнения. Вы можете иметь списки типов во время компиляции для метапрограммирования шаблона, но не во время выполнения.

Ваш «цикл» может быть реализован с помощью вариационного шаблона, но расширяя его во время компиляции, а не во время выполнения.

Могут быть (могут быть) типы в качестве значений первого класса — это то, что будет введено с отражением в C 23. В какой форме и что вы сможете с этим сделать, это другой вопрос.

Основная проблема для C в этом заключается в том, что типы фактически не существуют в скомпилированной программе. Типы в некотором смысле являются частью кода, и скомпилированная программа имеет дело не с кодом, а с данными (в C данные — это не код, а код — не данные; этот «барьер» будет нелегко преодолеть также по психологическим причинам).

Ответ №2:

Может ли C реализовать массив типов?

В C уже std::vector есть и std::array стандартные контейнеры.

Обратите внимание, что в C 17 типы на самом деле не являются гражданами первого класса. Но смотрите также <typeinfo> стандартный заголовок.

Вы могли бы хранить некоторую информацию о типе (по крайней мере, если у вас есть какая virtual -либо функция-член), но проблема заключается в том, чтобы при наличии экземпляра std::typeinfo получить значение этого типа.

Комментарии:

1. Извините, возможно, мой вопрос несколько неоднозначен. Я не хочу, чтобы массив хранил данные в некоторых типах, я хочу, чтобы массив хранил тип .