Перейти к содержанию
    

С++11 шаблонная функция, argument deduction

Мне надо было обойти std::tuple

Нагуглил вот такой рабочий кусок кода http://stackoverflow.com/a/8993311

#include <iostream>
#include <tuple>

template<std::size_t> struct int2type{};

template<class Tuple, std::size_t I>
void print_imp(Tuple const& t, int2type<I>){
  print_imp(t, int2type<I-1>());
  std::cout << ' ' << std::get<I>(t);
}

template<class Tuple>
void print_imp(Tuple const& t, int2type<0>){
  std::cout << std::get<0>(t);
}

template<class Tuple>
void print(Tuple const& t){
  static std::size_t const size = std::tuple_size<Tuple>::value;
  print_imp(t, int2type<size-1>());
}

В первый вызов print_imp() в качестве второго аргумента передается экземпляр int2type с шаблонным параметром size-1.

print_imp(t, int2type<size-1>());

Соответственно попадаем сюда

template<class Tuple, std::size_t I>
void print_imp(Tuple const& t, int2type<I>){
  print_imp(t, int2type<I-1>());
  std::cout << ' ' << std::get<I>(t);
}

 

КАК из того переданного экземляра int2type мы получили сохраненное там ранее I??????????

 

Я бы понял, если бы реализация int2type была более "классической", как у Александреску в библиотеке Loki, где внутри класса int2type есть static с сохраненным значением, но тут просто какая-то магия!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При каждом вызове создается отдельный экземпляр аргументов функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не раскрывает сути механизма получения I в теле функции.

 

На Stackowerflow мне дали ответ на этот вопрос

http://stackoverflow.com/questions/4240542...405523#42405523

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не раскрывает сути механизма получения I в теле функции.

 

На Stackowerflow мне дали ответ на этот вопрос

http://stackoverflow.com/questions/4240542...405523#42405523

 

Для каждого фигурируемого I компилятор сделает свою реализацию функции func. Аргументом шаблона может быть тип, величина (не тип), шаблон. В данном случае func шаблонизирован величиной типа int. Т. е. мы узнаем I не из экземпляра int2type, а I, как константа, является неотъемлемой частью каждой реализации func, которую компилятор генерировал, каждый раз когда встречал вызов func с новым типом аргумента.

Можно не использовать неявное выведение и вызывать функцию явно:

func<10>( int2type<10>() );

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...