sigmaN 0 22 февраля, 2017 Опубликовано 22 февраля, 2017 · Жалоба Мне надо было обойти 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 с сохраненным значением, но тут просто какая-то магия!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alecsej 0 23 февраля, 2017 Опубликовано 23 февраля, 2017 · Жалоба При каждом вызове создается отдельный экземпляр аргументов функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 23 февраля, 2017 Опубликовано 23 февраля, 2017 · Жалоба Это не раскрывает сути механизма получения I в теле функции. На Stackowerflow мне дали ответ на этот вопрос http://stackoverflow.com/questions/4240542...405523#42405523 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
conan 0 23 февраля, 2017 Опубликовано 23 февраля, 2017 · Жалоба Это не раскрывает сути механизма получения I в теле функции. На Stackowerflow мне дали ответ на этот вопрос http://stackoverflow.com/questions/4240542...405523#42405523 Для каждого фигурируемого I компилятор сделает свою реализацию функции func. Аргументом шаблона может быть тип, величина (не тип), шаблон. В данном случае func шаблонизирован величиной типа int. Т. е. мы узнаем I не из экземпляра int2type, а I, как константа, является неотъемлемой частью каждой реализации func, которую компилятор генерировал, каждый раз когда встречал вызов func с новым типом аргумента. Можно не использовать неявное выведение и вызывать функцию явно: func<10>( int2type<10>() ); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться