C++ Library Extensions 2022.12.09
To help learn modern C++ programming
057-reference_members.cpp
Go to the documentation of this file.
1#include <tpf_output.hpp>
2
5
6template<typename ElementType>
8{
9 private:
10 ElementType m_member;
11
12 public:
13 NonReferenceMembered(ElementType member):
14 m_member{ std::forward<ElementType>(member) } { }
15
16 void report() const
17 {
18 stream << "--- NonReferenceMembered ---\n\n";
19 stream << "Type of ElementType: " << Tpf_GetTypeName(ElementType) << endl;
20 stream << "Type of m_member: " << Tpf_GetTypeCategory(m_member) << endl << endl;
21 }
22};
23
24template<typename ElementType>
26{
27 private:
28 ElementType& m_member;
29
30 public:
31 LvalueReferenceMembered(ElementType& member):
32 m_member{ member } { }
33
34 void report() const
35 {
36 stream << "--- LvalueReferenceMembered ---\n\n";
37 stream << "Type of ElementType: " << Tpf_GetTypeName(ElementType) << endl;
38 stream << "Type of m_member: " << Tpf_GetTypeCategory(m_member) << endl << endl;
39 }
40};
41
42
43template<typename ElementType>
45{
46 private:
47 ElementType&& m_member;
48
49 public:
50 RvalueReferenceMembered(ElementType&& member):
51 m_member{ std::forward<ElementType>(member) } { }
52
53 void report() const
54 {
55 stream << "--- RvalueReferenceMembered ---\n\n";
56 stream << "Type of ElementType: " << Tpf_GetTypeName(ElementType) << endl;
57 stream << "Type of m_member: " << Tpf_GetTypeCategory(m_member) << endl << endl;
58 }
59};
60
62{
63 NonReferenceMembered<int> non_ref_init_int{ 5 };
64
65 int m = 6;
66 NonReferenceMembered<int&> non_ref_init_lvalue{ m };
67
68 NonReferenceMembered<int&&> non_ref_init_rvalue { 5 };
69
70 non_ref_init_int.report();
71 non_ref_init_lvalue.report();
72 non_ref_init_rvalue.report();
73}
74
76{
77 //LvalueReferenceMembered<int> lvalue_ref_init_int{ 5 };
78 // LvalueReferenceMembered<int&&> lvalue_ref_init_int{ 5 };
79
80 int m = 6;
81 LvalueReferenceMembered<int> lvalue_ref_init_int{ m };
82 lvalue_ref_init_int.report();
83
84 LvalueReferenceMembered<int&> lvalue_ref_init_lvalue_int{ m };
85 lvalue_ref_init_lvalue_int.report();
86
87 LvalueReferenceMembered<int&&> lvalue_ref_init_rvalue_lvalue_int{ m };
88 lvalue_ref_init_rvalue_lvalue_int.report();
89}
90
92{
93 RvalueReferenceMembered<int> rvalue_ref_init_rvalue{5};
94 rvalue_ref_init_rvalue.report();
95
96 // RvalueReferenceMembered<int&> rvalue_ref_lvalue_init_rvalue{5};
97
98 int m = 5;
99
100 // RvalueReferenceMembered<int> rvalue_ref_init_lvalue{ m };
101
102 RvalueReferenceMembered<int&> rvalue_ref_lvalue_int_lvalue{ m };
103 rvalue_ref_lvalue_int_lvalue.report();
104
105 // RvalueReferenceMembered<int&&> rvalue_ref_rvalue_init_rvalue{ m };
106 // RvalueReferenceMembered<int&&> rvalue_ref_rvalue_init_lvalue{m};
107
108 RvalueReferenceMembered<int&&> rvalue_ref_rvalue_init_rvalue{ std::move(m) };
109 rvalue_ref_rvalue_init_rvalue.report();
110
111}
112
113int main()
114{
115 // test_non_reference_membered();
116 // test_lvalue_reference_membered();
118}
void test_non_reference_membered()
void test_lvalue_reference_membered()
tpf::sstream stream
void test_rvalue_reference_membered()
auto endl
int main()
LvalueReferenceMembered(ElementType &member)
NonReferenceMembered(ElementType member)
RvalueReferenceMembered(ElementType &&member)
constexpr auto endl
Definition: tpf_output.hpp:973
Stream output operators << are implemented.
#define Tpf_GetTypeName(type_arg)
A macro that returns type_arg's string name.
Definition: tpf_types.hpp:1422
#define Tpf_GetTypeCategory(instance_arg)
A macro that returns instance_arg's type category string name.
Definition: tpf_types.hpp:1428