1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
1

Integer_sequence

30.06.2014, 16:23. Показов 1587. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Правильная ли такая реализация integer_sequence? У меня не компилируется, не могу сообразить почему.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <array>
#include <utility>
#include <tuple>
 
namespace isq {
 
template< class T, T... Ints >
class integer_sequence {
   static size_t size() { return sizeof...(Ints); }
};
 
template<std::size_t... Ints>
using index_sequence = integer_sequence<std::size_t, Ints...>;
 
template<class T, T... N>
using make_integer_sequence = integer_sequence<T, N... >;
 
template<std::size_t N>
using make_index_sequence = make_integer_sequence<std::size_t, N>;
 
template<class... T>
using index_sequence_for = make_index_sequence<sizeof...(T)>;
 
} //namespace isq
 
//////////////////////////////////////////////////////////////////////////////////////////
 
/// // Convert array into to tuple
template<typename Array, std::size_t... I>
auto a2t_impl(const Array& a, isq::index_sequence<I...>)
-> decltype(std::make_tuple(a[I]...))
{
   return std::make_tuple(a[I]...);
}
 
template<typename T, std::size_t N, typename Indices = isq::make_index_sequence<N>>
auto a2t(const std::array<T, N>& a)
-> decltype(a2t_impl(a, Indices()))
{
   return a2t_impl(a, Indices());
}
 
template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple_impl(std::basic_ostream<Ch,Tr>& os,
                      const Tuple & t,
                      isq::index_sequence<Is...>)
{
   using swallow = int[];
   (void)swallow{0, (void(os << (Is == 0? "" : ", ") << std::get<Is>(t)), 0)...};
}
 
template<class Ch, class Tr, class... Args>
auto operator<<(std::basic_ostream<Ch, Tr>& os, const std::tuple<Args...>& t)
-> std::basic_ostream<Ch, Tr>&
{
   os << "(";
   print_tuple_impl(os, t, isq::index_sequence_for<Args...>{});
   return os << ")";
}
 
int main()
{
   std::array<int, 4> array = {1,2,3,4};
 
   // convert an array into a tuple
   auto tuple = a2t(array);
   static_assert(std::is_same<decltype(tuple),
                 std::tuple<int, int, int, int>>::value, "");
 
   // print it to cout
   std::cout << tuple << '\n';
 
   system("pause");
   return 0;
}
Хотел испробовать вот этот пример: integer_sequence
0
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,879
30.06.2014, 19:54 2
DiffEreD, https://gist.github.com/doicanhden/7249956
1
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
30.06.2014, 19:54  [ТС] 3
Да, все оказалось сложнее чем я думал. Реализацию integer_sequence нашел здесь: A C++11 implementation of std::integer_sequence from C++14
schdub, надо ж как совпало
0
30.06.2014, 19:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru