1aam2am1 Temat założony przez niniejszego użytkownika |
Jak to działa? - template args index » 2016-09-25 18:46:30 Jak działa make_indexes, a dokładne typename make_indexes<Args...>::type() #include <iostream> #include <vector> using namespace std;
template < int...> struct index_tuple { };
template < int I, typename IndexTuple, typename...Types > struct make_indexes_impl;
template < int I, int...Indexes, typename T, typename...Types > struct make_indexes_impl < I, index_tuple < Indexes...>, T, Types...> { typedef typename make_indexes_impl < I + 1, index_tuple < Indexes..., I >, Types...>::type type; };
template < int I, int...Indexes > struct make_indexes_impl < I, index_tuple < Indexes...> > { typedef index_tuple < Indexes...> type; };
template < typename...Types > struct make_indexes : make_indexes_impl < 0, index_tuple <>, Types...> { };
template < typename A > void w( A j, int i ) { std::cout << i << " " << j << "\n"; }
struct pass { template < typename...T > pass( T...) { } };
template < typename...Args, int...Is > void wypisz( index_tuple < Is...>, Args...args ) { pass {( w < Args >( args, Is ), 1 )...}; }
template < typename...Args > void fun( Args...args ) { wypisz < Args...>( typename make_indexes < Args...>::type(), args...); }
int main() { fun( 1, "abc", 23 ); return 0; }
|
|
Monika90 |
» 2016-09-25 20:58:37 Dzisiaj już się tak nie pisze, teraz można tak #include <iostream>
template < class...Args > void fun( const Args &...args ) { unsigned n = 0; (...,( std::cout << n++ << ' ' << args << '\n' ) ); }
int main() { fun( 1, "abc", 23 ); return 0; }
|
|
1aam2am1 Temat założony przez niniejszego użytkownika |
» 2016-09-25 21:32:41 In function 'void fun(const Args& ...)': 7:6: error: expected primary-expression before '...' token 7:6: error: expected ')' before '...' token In instantiation of 'void fun(const Args& ...) [with Args = {int, char [4], int}]': 12:23: required from here 6:14: warning: unused variable 'n' [-Wunused-variable]
|
|
Monika90 |
» 2016-09-25 21:37:00 |
|
1aam2am1 Temat założony przez niniejszego użytkownika |
» 2016-09-25 21:41:48 c++17 ja pisze na c++11, gdy troche przerobiłem kod: struct pass { template < typename...T > pass( T...) { } };
template < typename A > void w( A j, int i ) { std::cout << i << " " << j << "\n"; }
template < class...Args > void fun( const Args...args ) { unsigned n = 0; pass {( w < Args >( args, n++ ), 1 )...}; }
int main() { fun( 1, "abc", 23 ); return 0; }
Mam warning: operation on 'n' may be undefined [-Wsequence-point] |
|
Monika90 |
» 2016-09-25 21:51:52 Nie wiem dlaczego ten warning. Jeżeli zrobić tak, to go nie ma. #include <iostream>
template < class...Args > void fun( const Args...args ) { unsigned n = 0; using array = int[ sizeof...( Args ) ]; array {( void( std::cout << n++ << ' ' << args << '\n' ), 1 )...}; }
int main() { fun( 1, "abc", 23, 6.6 ); return 0; }
|
|
1aam2am1 Temat założony przez niniejszego użytkownika |
» 2016-09-25 21:57:17 Lista inicjalizacyjna w twoim wypadku wymusza kolejność wywoływania. W moim nie jako że przekazuje n++ jako argument, a nie używam go na miejscu kompilator nie może zagwarantować, że wszystko pójdzie po myśli.
Ps. Zamykam temat. |
|
« 1 » |