Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Вызов foo(1,2.3, “abcd”) инстанциируется в foo<int, double, const char*>(1, 2.3, “abcd”)
“abcd” — это char const [5], а не const char*Мы вынуждены обернуть функцию в структуру, чтобы обойти запрет на специализацию функций
Не совсем так: тип “abcd” — это char const [5], а не const char*
char const(&)[5] =)Уточнение — на частичную специализацию функций.
366 // Compile-time integer sequences
367 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3658.html
368 // (Note that we only implement index_sequence, and not the more generic integer_sequence).
369 template<size_t... indexes> struct index_sequence {
370 static size_t size() { return sizeof...(indexes); }
371 };
372
373 template<size_t currentIndex, size_t...indexes> struct make_index_sequence_helper;
374
375 template<size_t...indexes> struct make_index_sequence_helper<0, indexes...> {
376 typedef std::index_sequence<indexes...> type;
377 };
378
379 template<size_t currentIndex, size_t...indexes> struct make_index_sequence_helper {
380 typedef typename make_index_sequence_helper<currentIndex - 1, currentIndex - 1, indexes...>::type type;
381 };
382
383 template<size_t length> struct make_index_sequence : public make_index_sequence_helper<length>::type { };
base_type& base = static_cast<base_type&>(*this);, поэтому sizeof(tuple<int>) == 4. Что качается лямбд, то они, как минимум такие же быстрые в рантайме, как и обычные функции, засчет того, что лямбда — это по сути неименованный функтор с объявленным внутри класса оператором вызова, который, как известно, в таких случаях является inline.
Variadic templates. Tuples, unpacking and more