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

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

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


Ответ
 
Опции темы
Старый 23.11.2020, 18:38   #1
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 76
По умолчанию Приведите пример инстанцирования 1го объекта

Есть такой пример.
Код:
#include <iostream>
 
 
template <class T, class U>
struct Typelist
{
    typedef T head; 
    typedef U Tail;
};
class NullType 
{ };
 
template < 
    typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
    typename T4 = NullType, typename T5 = NullType
>
class MakeList
{
    typedef typename MakeList< T2, T3, T4, T5 >::Result Tail;
 
public:
    typedef Typelist<T1, Tail> Result;
};
 
template <>
class MakeList<>
{
public:
    typedef NullType Result;
};
 
template <class TList> struct Length;
template <> 
struct Length< NullType >
{
    enum { value = 0 };
};
template <class T, class U>
struct Length< Typelist<T, U> >
{
    enum { value = 1 + Length<U>::value };
};
 
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;
};
 
//============ Примитивная реализация Tuple с использованием списка типов ==================
 
template <typename T, unsigned int I>
class TupleElement
{
public:
    T & get() 
    {
        return m_value;
    }
private:
    T m_value;
};
 
template <typename List, unsigned int I = 0>
class TupleImpl;
    
template <typename T, typename U, unsigned int I>
class TupleImpl<Typelist<T, U>, I>
    : public TupleElement<T, I>
    , public TupleImpl<U, I + 1>
{ };
template <unsigned int I>
class TupleImpl<NullType, I>
{ };
 
template <
    typename T1 = NullType, typename T2 = NullType, typename T3 = NullType,
    typename T4 = NullType, typename T5 = NullType    
>
class Tuple : public TupleImpl<typename MakeList<T1, T2, T3, T4, T5>::Result>
{
    typedef typename MakeList<T1, T2, T3, T4, T5>::Result ElementsList;
        
public:
    template <unsigned int Index>
    typename TypeAt<ElementsList, Index>::Result & get() 
    {
        TupleElement<typename TypeAt<ElementsList, Index>::Result, Index> & el = *this;
        return el.get();
    }
    enum 
    {
        Size = Length<ElementsList>::value
    };
    
};
 
//======================== Эмуляция перебора в цикле ====================================
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)>());
    }
};
 
template <typename Tuple>
struct TupleForEach_<Tuple, 0> 
{
    template <typename F>
    static void run(Tuple & tpl, F f) { }
};
 
template <typename Tuple, typename F>
void TupleForEeach(Tuple & x, F f) 
{
    TupleForEach_<Tuple>::run(x, f);
}
//=======================================================================
 
struct CoutPrinter {
    template <typename T>
    void operator()(T const & v) const 
    {
        std::cout << v << ' '; 
    }
};
 
void main()
{
    Tuple<int, char, double> tpl;
    
    tpl.get<0>() = 1;
    tpl.get<1>() = 'a';
    tpl.get<2>() = 3.14;
    
    TupleForEeach(tpl, CoutPrinter());
}
Я провёл такой эксперимент
Код:
template <typename F>
static void run(Tuple & tpl, F f)
{char dd[I]={12};cout<<sizeof(dd)<<" "<<*dd<<en;
TupleForEach_<Tuple, (I - 1)>::run(tpl, f);
f(tpl.template get<(I - 1)>());
}
На каждой итерации и в правду объявляется массив, который занимает разное количество байт с разницей в единицу. Минимальный размер 1, максимальный равен сумме всех рекурсий + 1ца. По сути чтобы объявить массив таким образом должна быть константа с периодом времени компиляции, и I - 1 как раз и выполняет такую роль.
Возникает вопрос а можно ли инстанцировать один объект несколько раз на примере этого кода. Пример нужно сделать несколько разных структур.
Код:
template <unsigned const int T>
struct Typelist{
typedef struct Typelist1{
char ii[T];
};};
Чтобы массив ii имел размер от 1го до 4ёх байт. Возможно ли написать такую рекурсию?

Хотелось бы увидеть пример как это будет выглядеть.
Loksiin12 вне форума Ответить с цитированием
Старый 23.11.2020, 18:53   #2
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 134
По умолчанию

Код:
template <unsigned const int T>
struct Typelist{
    typedef struct Typelist1{
        char ii[T];
    };
  
  Typelist1 a;
};

int main() {
    Typelist<4> a;
    Typelist<3> b;
    return sizeof(a.a) != sizeof(b.a);
}
FrosyaZZ вне форума Ответить с цитированием
Старый 23.11.2020, 18:56   #3
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 76
По умолчанию

FrosyaZZ, Не совсем то? хотелось бы чтобы хоть имя было одинаковым а не a b, я думаю что теоретически запустить такую рекурсию можно но могу быть не прав.
Loksiin12 вне форума Ответить с цитированием
Старый 23.11.2020, 18:56   #4
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 76
По умолчанию

Нужно как-то дорабатывать этот пример что уже есть имеется в виду этот длинный код
Loksiin12 вне форума Ответить с цитированием
Старый 24.11.2020, 12:10   #5
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 134
По умолчанию

Вы задачу то сформулируйте, а то похоже вы сами не понимаете, чего хотите.

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
хотелось бы чтобы хоть имя было одинаковым а не a b
Имя чего? Не может быть один объект одновременно и 4, и 5 байт.

Если вам нужно, чтобы Typelist1 истанцировался в зависимости от константы, то так в моем примере и есть. Уберите объекты и используйте Typelist1 как тип.
FrosyaZZ вне форума Ответить с цитированием
Старый 25.11.2020, 00:00   #6
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 76
По умолчанию

Цитата:
Сообщение от FrosyaZZ Посмотреть сообщение
Имя чего? Не может быть один объект одновременно и 4, и 5 байт.

Если вам нужно, чтобы Typelist1 истанцировался в зависимости от константы, то так в моем примере и есть. Уберите объекты и используйте Typelist1 как тип.
Нужно примерно так
Код:
    tpl.get<0>() = 1;
    tpl.get<1>() = 'a';
    tpl.get<2>() = 3.14;
Или чтобы были переменные типа static внутри функции чтобы можно было передавать функцию во внутрь и на крайний случай выполнение было таким
Код:
template <typename F>
static void run(Tuple & tpl, F f)
{char dd[I]={12};cout<<sizeof(dd)<<" "<<*dd<<en;
TupleForEach_<Tuple, (I - 1)>::run(tpl, f);
f(tpl.template get<(I - 1)>());
}
Где вместо char dd[I]={12}; будет static переменная которая хотя бы будет существовать внутри функции если не возможно реализовать первый вариант. Так что вариант предложеннный вами не пойдёт его нужно дорабатывать и очень сильно. Мне к сожалению тяжело даётся инстанцирование. С примером выше я разобрался но всё равно некоторые вещи мне понятно интуитивно. Что-то мне подсказывает что эта задумка тоже осуществима.
Loksiin12 вне форума Ответить с цитированием
Старый 25.11.2020, 12:52   #7
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 134
По умолчанию

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Нужно примерно так
Так оно итак так... шаблон инстанцируется в зависимости от константы. Что не так?

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Или чтобы были переменные типа static внутри функции
И? Надеюсь вы знаете, что значит static в данном контексте.

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
чтобы можно было передавать функцию во внутрь
Так передавайте. Кто мешает? Кстати, куда во внутрь?

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Где вместо char dd[I]={12};
Так от чего размер dd будет зависить?

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Мне к сожалению тяжело даётся инстанцирование.
Вы еще вариалики, сфинае, перегрузки и прочие не видели.
FrosyaZZ вне форума Ответить с цитированием
Старый 25.11.2020, 20:37   #8
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 76
По умолчанию

Цитата:
Сообщение от FrosyaZZ Посмотреть сообщение
И? Надеюсь вы знаете, что значит static в данном контексте.
По поводу статика я обознался, из моего примера видно что массив char создаётся внутри функции. Значит чтобы инстанцировать один объект нужно запустить рекурсию 4 раза, т.е. проблема заключается в том что списка типов как в примере выше Tuple<int, char, double> tpl; нет, а рекрсию запустить надо на крайний случай можно чтобы было так Tuple<1,2,3,4> tpl; а лучше и без такой записи но просто указать константой что нужно 4 итерации.
Loksiin12 вне форума Ответить с цитированием
Старый 25.11.2020, 20:40   #9
Loksiin12
Пользователь
 
Регистрация: 04.10.2020
Сообщений: 76
По умолчанию

Тот пример со структурой который я привёл возможно и не корректный, просто мне кажется что сущность будет примерна такая с использованием typedef , но опять же могу быть не прав. Инстанцирование даётся мне сложно а информации нормальной нет и книги читал и много сайтов просмотрено. Да и в принципе эта тема много кому не даётся из-за сложности.
Loksiin12 вне форума Ответить с цитированием
Старый 26.11.2020, 11:50   #10
FrosyaZZ
Форумчанин
 
Регистрация: 16.11.2020
Сообщений: 134
По умолчанию

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Значит чтобы инстанцировать один объект нужно запустить рекурсию 4 раза
Нет. В моем примере шаблон инстанцируется вообще без рекурсии.

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
т.е. проблема заключается в том что списка типов как в примере выше Tuple<int, char, double> tpl; нет, а рекрсию запустить надо на крайний случай можно чтобы было так Tuple<1,2,3,4> tpl;
А зачем оно надо?

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
а лучше и без такой записи но просто указать константой что нужно 4 итерации.
Ну так в моем примере и указано от константы...

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Инстанцирование даётся мне сложно
По-моему, вам простая логика дается сложно, а не инстанцирование. Все что тут было: это в a+b подставить а = 1 и обычная рекурсия, типа a(n) = a(n-1) + d.

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
а информации нормальной нет и книги читал и много сайтов просмотрено.
Та ладно...

Цитата:
Сообщение от Loksiin12 Посмотреть сообщение
Да и в принципе эта тема много кому не даётся из-за сложности.
Чего? Вы это, бросайте с ленивыми студентами общаться. Куча людей спокойно разбираются не только с инстанцированием, но и более сложными темами. А некоторые еще и ранжи, буст, формат, сол2, ... пишут.
FrosyaZZ вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приведите конкретный полезный пример использования собственного написанного класса Александр01 Общие вопросы Delphi 5 03.07.2017 12:50
приведите пример клиент-серверного приложения. ромик0 Общие вопросы C/C++ 8 21.06.2011 23:01
Пример создания класса и объекта в этом классе Valera Помощь студентам 0 19.04.2011 11:50
Пожалуйста, приведите пример использования NetMessageBufferSend. slavka1988 Работа с сетью в Delphi 5 20.03.2009 13:03


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS