Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 28.10.2020, 19:26   #51
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Но при инстанцировании компилятор порождает классы и функции.
Через какие классы и функции будет проходить схема при обращении к элементу tpl1.get<0>(), слишком ли это дорого, я думаю что часть этого кода упаковывается некоторые структуры в принципе сольются. Возможно ошибаюсь.
Код:
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
{
    typedef Head Result;
};
Куда здесь идёт 0 и для чего? Может сюда unsigned int Index Index=0 будет внутри структуры.
Loksiin12 вне форума Ответить с цитированием
Старый 28.10.2020, 19:37   #52
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 353
По умолчанию

get<0>() - превратится в нечто вроде

Код:
struct
{
    char var0;//0
    int var1;//1
    float var2;//2
    double var3;//3

    //get<0>() - превратится в нечто вроде
   char& get_0()
   {
     return var0;
   }

}var;
а после оптимизации, я полагаю, будет и вовсе прямое обращение к полю var0. То есть, в итоге, в рантайме шаблон вообще ничего не будет стОить
Алексей1153 вне форума Ответить с цитированием
Старый 28.10.2020, 19:40   #53
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 353
По умолчанию

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Куда здесь идёт 0 и для чего
здесь снова система из заглушки и рекурсивного вызова

Код:
template <class TList, unsigned int Index> struct TypeAt;
 
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0>
{
    typedef Head Result;
};
 
template <class Head, class Tail, unsigned int Index>
struct TypeAt<Typelist<Head, Tail>, Index>
{
    typedef typename TypeAt<Tail, Index - 1>::Result Result;
};
специализация template <class Head, class Tail>struct TypeAt<Typelist<Head, Tail>, 0> применится, когда константа в третьем параметра станет равна нулю при очередном рекурсивном применении ... Index - 1 ...
Алексей1153 вне форума Ответить с цитированием
Старый 28.10.2020, 19:46   #54
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 353
По умолчанию

в итоге именно typedef Head Result; и будет конечным типом, который торчит из TypeAt<Tail, Index - 1>::Result . И этот тип будет соответствовать своему индексу 0...n
Алексей1153 вне форума Ответить с цитированием
Старый 29.10.2020, 13:32   #55
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
в рантайме шаблон вообще ничего не будет стОить
Перевести код на Ассемблер и посмотреть нагрузку, тут нужно найти какой нить онлайн калькулятор и посмотреть как читается элемент массива, как читается обычная переменная ну и элемент кортежа тоже.
Для чего мы здесь наследуем классы https://programmersforum.ru/showpost...39&postcount=1
Код:
template <typename T, typename U, unsigned int I>
class TupleImpl<Typelist<T, U>, I>
    : public TupleElement<T, I>
    , public TupleImpl<U, I + 1>
{ };
Loksiin12 вне форума Ответить с цитированием
Старый 30.10.2020, 15:22   #56
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 353
По умолчанию

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Перевести код на Ассемблер
вот, пробуй тут https://godbolt.org/


Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
наследуем
TupleElement - хранит в себе поле типа T. Но при этом в самом "имени" класса незримо присутствует параметр I - константа с индексом. Это, стало быть, используется при рекурсивных применениях шаблонов (имеет значение полный тип, включая все его параметры, переданные в шаблон при инстанцировании)

TupleImpl - содержит тип ElementsList, выведенный как колбаса из типов при участии шаблона MakeList, и константу Size - количество "значащих" типов (поскольку их может быть меньше 5 - максимального жёстко зашитого количества типов в кортеже)
Алексей1153 вне форума Ответить с цитированием
Старый 31.10.2020, 20:44   #57
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 68
По умолчанию

Алексей1153, Хреново что по индексу через переменную нельзя попадать по элементам кортежа, либо через константу цифрами либо рекурсивный проход с помощью
Код:
template <typename Tuple, unsigned int I = Tuple::Size>
struct TupleForEach_ 
{
    template <typename F>
    static void run(Tuple & tpl, F f) 
    {
        TupleForEach_<Tuple, (I - 1)>::run(tpl, f);
        f(tpl.template get<(I - 1)>());
    }
};
Функцию run можно накачивать дополнительными выражениям т.к. она работает в режиме выполнения. Практически можно сказать что от этих кортежей мало толку, у меня то есть идеи куда это применять но всё же шкурка выделки не стоит.
Loksiin12 вне форума Ответить с цитированием
Старый 31.10.2020, 21:39   #58
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 353
По умолчанию

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Хреново что по индексу через переменную нельзя попадать по элементам кортежа
не понимаю, о чём речь
Алексей1153 вне форума Ответить с цитированием
Старый 31.10.2020, 23:03   #59
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
не понимаю, о чём речь
бывает ситуация когда нужно взять указатель нужного типа и храниться этот индекс в переменной и по сути это уже не константа, единственный способ попасть в нужный индекс это использовать функцию
Код:
static void run(Tuple & tpl, F f) 
    {
        TupleForEach_<Tuple, (I - 1)>::run(tpl, f);
        f(tpl.template get<(I - 1)>());
    }
, но прежде чем схема доберётся до нужного индекса будет крутиться рекурсия а уж затем попадание и выход, тут просто он не прописан, но его можно прописать. Меня интересует попадание в нужный индекс не через константу т.к. значение в переменной, и о константе не может быть и речи и не через рекурсию т.к. это дорого а прямой прыжок в нужный индекс. Я так понял реализовать это невозможно.
Loksiin12 вне форума Ответить с цитированием
Старый 31.10.2020, 23:13   #60
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 353
По умолчанию

Цитата:
template <typename Tuple, unsigned int I = Tuple::Size>
struct TupleForEach_
{
template <typename F>
static void run(Tuple & tpl, F f)
{
TupleForEach_<Tuple, (I - 1)>::run(tpl, f);
f(tpl.template get<(I - 1)>());
}
};
здесь нет рантайм-рекурсии, это рекурсия метапрограммная. Для рантайма будет каскадный вызов функций разных классов в дебаге. А в релизе будет без всего этого сразу обращение к нужной переменной - оптимизатор это сделает
Алексей1153 вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разобраться с кодом Boris2 Помощь студентам 1 15.07.2013 14:58
С++ разобраться с кодом marina12 Помощь студентам 2 21.05.2013 22:22
разобраться с кодом iris_ka Помощь студентам 0 16.05.2012 16:19
Разобраться с кодом. Vlero PHP 2 20.01.2011 12:46
проблемка с кодом, результат получается немного не такой как надо hen Помощь студентам 3 24.04.2009 14:11


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя