Кортежи C ++ 0x хранят элементы в обратном направлении

После небольшого исследования я обнаружил, что C ++ 0x хранит элементы в кортеже в обратном порядке в памяти.

Например, возьмите этот код:

std::tuple<char, char, char> x('\0', 'b', 'a');
char* y = (char*)&x;
std::cout << sizeof(x) << std::endl;
std::cout << y << std::endl;

При компиляции с GCC 4.5.2 я получаю следующий результат :

3
ab

Это сначала озадачило меня. Почему данные хранятся в обратном порядке? После поиска непреднамеренно запутанных заголовков GNU я заметил, что реализация была похожа на это:

template<typename head, typename... tail> class tuple<head, tail...> : public tuple<tail...>
{
  head value;
  ...
};

Поскольку базовый класс содержит последний элемент, то следующий производный class содержит предпоследний и т. д., фактический порядок аргументов шаблона обратный.

Когда я впервые познакомился с кортежами, я подумал, что могу использовать их для такой функции, как glInterleavedArrays () , которая устанавливает массив данных вершин в виде кортежей цветов, координат текстуры, нормалей и точек. . Конечно, если я сделаю массив кортежей, эти данные придется вводить в обратном порядке, что может привести к действительно странным ошибкам, если вы случайно забудете расположить аргументы в правильном порядке.

Что насчет чего-то вроде этого?

template<typename... head, typename tail> class tuple<head..., tail> : public tuple<head...>
{
  tail value;
  ...
};

В GCC 4.5.2:

ошибка: аргумент пакета параметров 'head ...' должен находиться в конце списка аргументов шаблона

Если это не станет доступным в будущем, я в значительной степени застрял в поисках другого способа реализовать это. Есть другой способ? Каким образом обмануть GCC и получить правильно упорядоченный кортеж с точки зрения памяти?

6
задан ShadowRanger 13 September 2019 в 17:28
поделиться