-
Notifications
You must be signed in to change notification settings - Fork 0
/
example.cpp
55 lines (42 loc) · 1023 Bytes
/
example.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
#include <iostream>
#include "src/unique_ref.hpp"
//
using unique_ref::uref; // unique reference
using unique_ref::ucref; // unique reference only for concrete types
class XAbstract
{
public:
virtual void print() = 0;
};
class XConcrete : public XAbstract
{
public:
int x{0};
void print() override {}
};
class Incomplete; // forward decl.
class UseIncomplete
{
public:
static uref<Incomplete> r;
};
class Incomplete
{
public:
void iprint(){};
};
uref<Incomplete> UseIncomplete::r{Incomplete{}};
int main()
{
ucref<XConcrete> refX{XConcrete{}};
int y = refX->x;
XConcrete c1 = *refX; // copy
XConcrete c2 = refX; // copy without operator*... nice! only possible on 'ucref' type
// cannot use 'ucref' for abstract types! use general 'uref'
uref<XAbstract> refXA{std::unique_ptr<XAbstract>{new XConcrete{}}};
XAbstract &c3 = *refXA; // ok, reference passing
//XConcrete c4 = refXA; // cannot do this! abstract type!
UseIncomplete use;
use.r->iprint();
return 0;
}