-
Notifications
You must be signed in to change notification settings - Fork 0
/
deduction_type.cc
74 lines (62 loc) · 1.79 KB
/
deduction_type.cc
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
#include <iostream>
#include <boost/type_index.hpp>
using namespace std;
using boost::typeindex::type_id_with_cvr;
template<class T>
void f(std::initializer_list<T> a) {
return;
}
template<typename T>
void f(T ¶m)
{
cout << "[Case 1] (T ¶m) T = " << type_id_with_cvr<T>().pretty_name() << endl;
cout << "[Case 1] (T ¶m) param = " << type_id_with_cvr<decltype(param)>().pretty_name() << endl;
}
template<typename T>
void cf(const T ¶m)
{
cout << "[Case 1] (const T ¶m) T = " << type_id_with_cvr<T>().pretty_name() << endl;
cout << "[Case 1] (const T ¶m) param = " << type_id_with_cvr<decltype(param)>().pretty_name() << endl;
}
// 在编译时返回一个数组长度,这里只关注数组长度,所以忽略了数组名
// constexpr关键字使结果在编译期可用
template<class T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept {
return N;
}
template<class T>
void rf(T &¶m)
{
cout << "[Case 2] (T &¶m) T = " << type_id_with_cvr<T>().pretty_name() << endl;
cout << "[Case 2] (T &¶m) param = " << type_id_with_cvr<decltype(param)>().pretty_name() << endl;
}
template<class T>
void cbvf(T param)
{
cout << "[Case 3] (T param) T = " << type_id_with_cvr<T>().pretty_name() << endl;
cout << "[Case 3] (T param) param = " << type_id_with_cvr<decltype(param)>().pretty_name() << endl;
}
int main() {
int x = 27;
const int cx = x;
const int &rx = x;
f(x);
f(cx);
f(rx);
cf(x);
cf(cx);
cf(rx);
int kv[] = {1,3,7,9,11,22,35};
std::array<int, arraySize(kv)> arrays;
cout << "[Case 1] (T (&)[N]) array len = " << arrays.size() << endl;
rf(x);
rf(cx);
rf(rx);
rf(27);
cbvf(x);
cbvf(cx);
cbvf(rx);
const char *const cptr = "Fun with pointers";
cbvf(cptr);
return 0;
}