Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak to działa? - template args index

Ostatnio zmodyfikowano 2016-09-25 21:57
Autor Wiadomość
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()
C/C++
#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 );
    // your code goes here
    return 0;
}
P-152003
Monika90
» 2016-09-25 20:58:37
Dzisiaj już się tak nie pisze, teraz można tak
C/C++
#include <iostream>

template < class...Args >
void fun( const Args &...args )
{
    unsigned n = 0;
    (...,( std::cout << n++ << ' ' << args << '\n' ) );
}

int main()
{
    fun( 1, "abc", 23 );
    // your code goes here
    return 0;
}
P-152015
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]
 
P-152021
Monika90
» 2016-09-25 21:37:00
Najnowszy GCC i clang radzą sobie z tym.

Dowód http:/​/coliru.stacked-crooked.com/a​/e03b6928037c1ddb


P-152024
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:
C/C++
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 );
    // your code goes here
    return 0;
}
Mam warning: operation on 'n' may be undefined [-Wsequence-point]
P-152025
Monika90
» 2016-09-25 21:51:52
Nie wiem dlaczego ten warning.

Jeżeli zrobić tak, to go nie ma.
C/C++
#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 );
    // your code goes here
    return 0;
}
P-152027
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.
P-152028
« 1 »
  Strona 1 z 1