Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: С++11 шаблонная функция, argument deduction
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
sigmaN
Мне надо было обойти 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 с сохраненным значением, но тут просто какая-то магия!!!
MrAlex
При каждом вызове создается отдельный экземпляр аргументов функции.
sigmaN
Это не раскрывает сути механизма получения I в теле функции.

На Stackowerflow мне дали ответ на этот вопрос
http://stackoverflow.com/questions/4240542...405523#42405523
conan
Цитата(sigmaN @ Feb 23 2017, 15:38) *
Это не раскрывает сути механизма получения I в теле функции.

На Stackowerflow мне дали ответ на этот вопрос
http://stackoverflow.com/questions/4240542...405523#42405523


Для каждого фигурируемого I компилятор сделает свою реализацию функции func. Аргументом шаблона может быть тип, величина (не тип), шаблон. В данном случае func шаблонизирован величиной типа int. Т. е. мы узнаем I не из экземпляра int2type, а I, как константа, является неотъемлемой частью каждой реализации func, которую компилятор генерировал, каждый раз когда встречал вызов func с новым типом аргумента.
Можно не использовать неявное выведение и вызывать функцию явно:
func<10>( int2type<10>() );
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.