-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
95 lines (79 loc) · 2.44 KB
/
main.cpp
File metadata and controls
95 lines (79 loc) · 2.44 KB
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
92
93
94
95
#include <iostream>
#include <vector>
#include <list>
#include <tuple>
#include <type_traits>
#include <ostream>
/// \file
/// @file
/**
* @brief IP в интегральном виде.
* @tparam T - любой интегральный тип.
* @param ip - значение ip-адреса представленное в интегральном типе.
*/
template <typename T>
typename std::enable_if_t<std::is_integral<T>::value> print_ip(const T& ip)
{
for (size_t i = sizeof(T); i != 0 ; i--)
std::cout << ((ip >> (8*(i-1))) & 0xff) << (i != 1 ? "." : "");
}
template <typename T>
struct is_string : std::false_type { };
template <> struct is_string<std::string> : std::true_type { };
/**
* @brief IP в строковом виде.
* @tparam T - тип std::string.
* @param ip - значение ip-адреса представленное в виде std::string.
*/
//template <typename T>
//typename std::enable_if<std::is_same<T, std::string>::value, void>::type
template <typename T>
typename std::enable_if<is_string<T>::value, void>::type
print_ip(T ip)
{
std::cout << ip;
}
template <typename T>
struct is_container : std::false_type { };
template <typename... Ts> struct is_container<std::list<Ts...> > : std::true_type { };
template <typename... Ts> struct is_container<std::vector<Ts...> > : std::true_type { };
/**
* @brief IP в контейнерном.
* @tparam T - контейнерный тип: vactor / list.
* @param ip - значение ip-адреса представленное в виде контейнера.
*/
template <typename T>
std::enable_if_t<is_container<T>::value>
print_ip(const T& ip)
{
for (const auto& item : ip)
{
std::cout << item;
std::cout << (&item != &ip.back() ? "." : "");
}
}
//template <typename T>
//struct is_tuple : std::false_type {};
//template <typename... Args>
//struct is_tuple<std::tuple<Args...>> : std::true_type {};
/**
* @brief Функция main
*/
int main(int, char *[])
{
print_ip(char(-1));
std::cout << std::endl;
print_ip(short(0));
std::cout << std::endl;
print_ip(int(2130706433));
std::cout << std::endl;
print_ip(long(8875824491850138409));
std::cout << std::endl;
print_ip(std::string("127.0.0.1"));
std::cout << std::endl;
print_ip(std::vector<uint>{127, 0, 0, 1});
std::cout << std::endl;
print_ip(std::list<uint>{127, 0, 0, 1});
std::cout << std::endl;
return 0;
}