#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. Извините, возможно, мой вопрос несколько неоднозначен. Я не хочу, чтобы массив хранил данные в некоторых типах, я хочу, чтобы массив хранил тип .