Parameter pack to index sequence pack
От: koenjihyakkei Россия  
Дата: 26.05.20 11:55
Оценка:
Всем привет!

Нужно вместе с параметром из параметр пака передавать его индекс, можно ли такое сделать?

Код ниже(не компилируется).

Ожидается вывод:
0: str0
1: str1
2: str2

http://coliru.stacked-crooked.com/a/0c3af307af1638e8

#include <utility>
#include <tuple>
#include <iostream>

using namespace std;

void pr(const char* c, int n) {
    cerr << n << ": " << c << endl;
}

template<class... Args>
void fn(Args... args) {
    index_sequence_for<Args...> seq;
    (pr(args, seq), ...);
}

int main()
{
    fn("str0", "str1", "str2");
    return 0;
}
Re: Parameter pack to index sequence pack
От: ViTech  
Дата: 26.05.20 12:46
Оценка: 5 (2)
Здравствуйте, koenjihyakkei, Вы писали:

K>Нужно вместе с параметром из параметр пака передавать его индекс, можно ли такое сделать?


Навскидку:
http://coliru.stacked-crooked.com/a/047bafeaa57d9dab
#include <utility>
#include <tuple>
#include <iostream>

using namespace std;

void pr(const char* c, int n) {
    cerr << n << ": " << c << endl;
}

template<class... Args>
void fn(Args... args) {
    int n = 0;
    (pr(args, n++), ...);
}

int main()
{
    fn("str0", "str1", "str2");
    return 0;
}
Пока сам не сделаешь...
Re[2]: Parameter pack to index sequence pack
От: koenjihyakkei Россия  
Дата: 26.05.20 14:52
Оценка:
Здравствуйте, ViTech, Вы писали:

Хах, действительно, об этом не подумал

Но все же интересно, средствами метапрограммирования можно ли такое сделать.
Re[3]: Parameter pack to index sequence pack
От: ViTech  
Дата: 26.05.20 16:50
Оценка: 2 (2)
Здравствуйте, koenjihyakkei, Вы писали:

K>Но все же интересно, средствами метапрограммирования можно ли такое сделать.


Возможен вариант с таким костылём:
http://coliru.stacked-crooked.com/a/afde491174748633
#include <utility>
#include <iostream>

void pr(const char* c, int n)
{
    std::cout << n << ": " << c << std::endl;
}

template <class ... Args, std::size_t... N>
void fn(Args&& ... args, std::index_sequence<N...>)
{
    (pr(std::forward<Args>(args), N), ...);
}

template <class ... Args>
void fn(Args&& ... args)
{
    fn<Args...>(std::forward<Args>(args)...,
                std::make_index_sequence<sizeof... (Args)>{});
}

int main()
{
    fn("str0", "str1", "str2");
    return 0;
}
Пока сам не сделаешь...
Re: Parameter pack to index sequence pack
От: reversecode google
Дата: 27.05.20 13:20
Оценка:
еще вариант
http://coliru.stacked-crooked.com/a/cc0d06d1f52937cf
#include <utility>
#include <tuple>
#include <iostream>

using namespace std;

template<typename T, size_t ... n>
void pr_impl(const T &t, index_sequence<n...> ) {
    ((cerr << n << ' ' << std::get<n>(t)<<' '), ...);
}

template<typename ... Args>
void pr_impl1(const tuple<Args... > & args)
{
    pr_impl(args, index_sequence_for<Args...>{});
}

template<typename ... Args>
void fn(Args ... args) {
    pr_impl1(make_tuple(args...));
}

int main()
{
    fn("str0", "str1", "str2");
    return 0;
}
Re[3]: Parameter pack to index sequence pack
От: Шахтер Интернет  
Дата: 27.05.20 17:30
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>Здравствуйте, ViTech, Вы писали:


K>Хах, действительно, об этом не подумал


K>Но все же интересно, средствами метапрограммирования можно ли такое сделать.


Без проблем. Вот Вариант из CCore здесь

/* main.cpp */

#include <CCore/inc/Print.h>

/* main() */

using namespace CCore;

template <class IList,class ... TT> struct ShowList;

template <class ... TT,int ... IList>
struct ShowList<Meta::IndexListBox<IList...>,TT...>
 {
  static void Show(auto t,int Ind)
   {
    Printf(Con,"#;) #;\n",Ind,t);
   }

  static void Show(TT ... tt)
   {
    ( Show(tt,IList) , ... );
   }
 };

template <class ... TT>
void show(TT ... tt)
 {
  ShowList<Meta::IndexList<1,TT...>,TT...>::Show(tt...);
 }

int main() 
 {
  show(101,102,103);

  return 0;
 }
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.