Информация об изменениях

Сообщение Re: Можно ли и как канонично получить из итератора тип элеме от 18.04.2025 8:36

Изменено 18.04.2025 8:36 rg45

Re: Можно ли и как канонично получить из итератора тип элемента последовательнос
Здравствуйте, Marty, Вы писали:

M>Можно ли и как канонично получить из итератора тип элемента последовательности?

M>Я хочу из любого типа итераторов одинаковым способом получить const char*.

Это две совершенно разные задачи. Вторая решаема (я показал
Автор: rg45
Дата: 18.04.25
вариант решения).

Первая же задачва нерешаема в принципе. Давай рассмотрим такой псевдокод:

// Имеем несколько классов контейнеров.
// Каждый класс содержит внутри определения своих итераторов.
// И разумеется уникальность типов итераторов никто не гарантирует.

struct Containter1 { using iterator = int*; };
struct Containter2 { using iterator = int*; };
struct Containter3 { using iterator = int*; };

// Допустим, что по типу итератора можно вывести тип контейнера.
template <typename ContainerType>
void foo(ContainerType::iterator);

int main()
{
   // Попоробуем заюзать это дело.
   Container1::iterator it1;
   Container2::iterator it2;
   Container3::iterator it3;

   // Вот в этом месте самое время обратить внимание на то,
   // что объекты it1, it2, it3 имеют один и тот же тип - int*.

   // И каким образом компилятор должен понять,
   // что в следующих случаях должны быть выведены различные типы контейнеров?

   foo(it1);
   foo(it2);
   foo(it3);
}
Re: Можно ли и как канонично получить из итератора тип элеме
Здравствуйте, Marty, Вы писали:

M>Можно ли и как канонично получить из итератора тип элемента последовательности?

M>Я хочу из любого типа итераторов одинаковым способом получить const char*.

Это две совершенно разные задачи. Вторая решаема (я показал
Автор: rg45
Дата: 18.04.25
вариант решения).

Первая же задача нерешаема в принципе. Давай рассмотрим такой псевдокод:

// Имеем несколько классов контейнеров.
// Каждый класс содержит внутри определения своих итераторов.
// И разумеется уникальность типов итераторов никто не гарантирует.

struct Containter1 { using iterator = int*; };
struct Containter2 { using iterator = int*; };
struct Containter3 { using iterator = int*; };

// Допустим, что по типу итератора можно вывести тип контейнера.
template <typename ContainerType>
void foo(ContainerType::iterator);

int main()
{
   // Попоробуем заюзать это дело.
   Container1::iterator it1;
   Container2::iterator it2;
   Container3::iterator it3;

   // Вот в этом месте самое время обратить внимание на то,
   // что объекты it1, it2, it3 имеют один и тот же тип - int*.

   // И каким образом компилятор должен понять,
   // что в следующих случаях должны быть выведены различные типы контейнеров?

   foo(it1);
   foo(it2);
   foo(it3);
}