Всем привет!
Нужно вместе с параметром из параметр пака передавать его индекс, можно ли такое сделать?
Код ниже(не компилируется).
Ожидается вывод:
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;
}
Здравствуйте, 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;
}
Здравствуйте, ViTech, Вы писали:
Хах, действительно, об этом не подумал
Но все же интересно, средствами метапрограммирования можно ли такое сделать.
Здравствуйте, 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;
}
еще вариант
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;
}
Здравствуйте, 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;
}