LINUX.ORG.RU

C++, шаблоны и шаблоны в шаблонах

 ,


0

3

Совсем запутался с шаблонами. Сделал примитивные классы, но не пойму как достучаться до параметра типа во вложенном шаблоне (не уверен, что правильно даже называю). Поставил тип auto, всё работает, но всё же хочу понять как делали раньше.

template <class T>
class Pair {};

template <template <class ST> class T>
class Node {};

Node<Pair<int>> node({5, 6});

Полный код тут: https://pastebin.com/Q9XhXqAG

Кажется я что-то не понимаю, буду рад объяснению.

Если понял, в чём проблема, то так (Node(T<auto> value) это же и сгенерирует):

template <typename S>
Node(T<S> value):value(value) { }
ST в template <template <class ST> class T> не связывается ни с чем, это просто имя, которое можно не писать и разницы не будет.

xaizek ★★★★★ ()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от xaizek

ST похоже действительно ни с чем не связывается.

Другой пример: параметром шаблонизированного класса является класс, который создан из шаблона array<int> и я как-то хочу добраться из своего класса до int.

В коде по ссылке - из Node добраться до int. Конечно же я могу попробовать вызвать Node<Pair, int>, но почему-то казалось, что должен быть способ.

AlexKiriukha ★★★★ ()
Последнее исправление: AlexKiriukha (всего исправлений: 1)
Ответ на: комментарий от AlexKiriukha

В Pair добавить

using type = T;
А в Node
typename T::type
Если бы был другой способ, то в стандартной библиотеке не было бы столько typedef внутри классов.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Спасибо! Скомпилил и работает. Я не знал об using type.

Правда это подходит для своего кода, не ясно как быть с библиотеками. Думал посмотреть stl algorithms, но боюсь пока туда заглядывать.

AlexKiriukha ★★★★ ()

Кто же вас учит этому «стилю», ну это ладно.

У тебя вообще это не может работать и причина проста - ты передаёшь не шаблонный тип в шаблонный тип, подобное в принципе не имеет смысла.

Если проще, ты должен в подобный тип передать то, к чему можно примерить <T>, в твоём случае ты уже это применил.

Если ещё проще. На примере без типов. У тебя есть некий объект, в который ты должен передать T(int), а ты взял и передал туда f(1), т.е. значение, и теперь пытаешься из сигнатуры T(int) получить значение int, т.е. 1.

Поставил тип auto, всё работает, но всё же хочу понять как делали раньше.

Что и куда ты поставил и каким образом это могло заработать - неясно.

LjubaSherif ()
Ответ на: комментарий от LjubaSherif

Кто же вас учит этому «стилю», ну это ладно.

Удивительные фразы «всё не так, но не скажу что». Поэтому стиль какой получился.

Что и куда ты поставил и каким образом это могло заработать - неясно.

По ссылке есть код и там есть ключевое слово auto.

AlexKiriukha ★★★★ ()
Ответ на: комментарий от AlexKiriukha

Удивительные фразы «всё не так, но не скажу что». Поэтому стиль какой получился.

Это же местная знаменитось, сам Царь, который, среди прочего, известен своей способностью постить объемные портянки бессмысленного текста.

eao197 ★★★★★ ()
Ответ на: комментарий от AlexKiriukha

Удивительные фразы «всё не так, но не скажу что». Поэтому стиль какой получился.

Они не удивительны. Зачем я тебе буду рассказывать о том, что для 98% определяют не они? Особенно о каких-то непопулярных рассуждений на тему логики и прочего.

Давай я тебе задам пару вопросов:

template <class T>//зачем? Ты в 95году и у тебя терминал в 100символов шириной?
class Pair
{//зачем?


Pair(T left, T right): left(left), right(right) {}//почему тут переноса нет? Ни в случае со скобками, ни в случае с инициализацией. Почему такая непоследовательность?

template <template <class ST> class T>// зачем пробелы между template< - какой в этом смысл? Почему пробелов у тебя нет после  Pair(. Бессмысленно + непоследовательность.


  Node(T<ST> value):
    value(value)
  {
  }

//вот, тут уже пошла последовательность, но ты сам понимаешь - выглядит это как дерьмо.

const auto& getValue() const { return value; }
//Непоследовательность, опять нет переводов строк и переноса. 
//Ладно, const auto& - оставим это базовая привычка тех, кто не понимает сишной/крестовой системы типов.

По ссылке есть код и там есть ключевое слово auto.

Какое это имеет отношение к начальному вопросу? Там авто для вывода типа - это никак не починит твой код.

LjubaSherif ()
Ответ на: комментарий от LjubaSherif

Это был тестовый пример, в котором я уменьшил количество строк кода. Чтобы людям было проще читать (влазило на экран).

По поводу auto. В этом и был вопрос. Как получить параметр предыдущего шаблона. Как в Node<Pair<int>> получить int. Всё. Я не знал такое возможно или нет.

AlexKiriukha ★★★★ ()
Ответ на: комментарий от LjubaSherif

зачем? Ты в 95году и у тебя терминал в 100символов шириной?

Ты шириной колонок в газетах тоже возмущаешься?

trex6 ★★★★★ ()
Ответ на: комментарий от trex6

да он программер локалхоста, как только начнёт смотреть pull requests других участников команды, сразу заголосит про длинные строки

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.