-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprint_ip.cpp
91 lines (82 loc) · 2.08 KB
/
print_ip.cpp
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include<iostream>
#include<list>
#include<vector>
#include<string>
#include<tuple>
#include<type_traits>
template<typename Tuple, std::size_t N>
struct TuplePrinter {
static void print(const Tuple& t)
{
TuplePrinter<Tuple, N-1>::print(t);
std::cout << "." << std::get<N-1>(t);
}
};
template<typename Tuple>
struct TuplePrinter<Tuple, 1> {
static void print(const Tuple& t)
{
std::cout << std::get<0>(t);
}
};
//! Функция печати адреса для контейнеров
template <
typename T,
typename std::enable_if<
!(std::is_integral<T>::value
|| std::is_same<T, std::string>::value),
T*
>::type = nullptr
>
void print(const T& val)
{
for(auto i=val.begin();i!=val.end();++i)std::cout<<*i<<(i==--val.end() ?'\n':'.');
}
//! Функция печати адреса для строки
template <
typename T,
typename std::enable_if<
std::is_same<T,std::string>::value,
T*
>::type = nullptr
>
void print(const T& val)
{
std::cout<<val<<std::endl;
}
//! Функция печати адреса для целочисленных типов
template <
typename T,
typename std::enable_if<
std::is_integral<T>::value,
T*
>::type = nullptr
>
void print(T val)
{
size_t bytes = sizeof(val);
for (size_t i = 1; i <= bytes; i++)
{
std::cout << ((i > 1) ? "." : "") << (unsigned int)(reinterpret_cast<unsigned char*>(&val))[bytes - i];
}
std::cout << std::endl;
}
//! Функция печати адреса для кортежей
template<class... Args>
void print(std::tuple<Args...> t)
{
TuplePrinter<decltype(t), sizeof...(Args)>::print(t);
std::cout<<std::endl;
};
int main()
{
print( char(-1));
print( short(0));
print( int(2130706433));
print( long(8875824491850138409));
print( std::string("255.255.255.255"));
print( std::vector<int>{1,2,3,4});
print( std::list<short>{12,34,56,78});
print( std::make_tuple(100,200,300,400));
return 0;
}