@@ -16,19 +16,28 @@ struct VTableBase {
1616 void bind () {}
1717};
1818
19+
1920template <typename VTableType>
20- struct ViewBase
21+ class ViewBase
2122{
23+ protected:
2224 void * _obj;
2325 VTableType * _vtbl;
2426};
2527
2628
29+ template <typename T>
30+ struct exposer : public T {};
31+
2732struct writable
2833{
34+ // forward delcarations
35+ struct view ;
36+ template <typename T> view make_view (T & );
37+
38+
2939 template <typename BaseVTable = VTableBase>
30- struct vtable : public BaseVTable
31- {
40+ struct vtable : public BaseVTable {
3241 int (*write)(void * obj, const char *, int );
3342
3443 template <typename T>
@@ -55,18 +64,24 @@ struct writable
5564 template <typename BaseViewLayer = ViewBase<vtable<>>>
5665 struct ViewLayer : public BaseViewLayer
5766 {
67+ protected:
5868 using BaseViewLayer::_obj;
5969 using BaseViewLayer::_vtbl;
6070
71+ public:
6172 int write (const char * arg0, int arg1) { return _vtbl->write (_obj, arg0, arg1); }
6273 };
6374
64- struct view : public ViewLayer <> {};
75+ struct view : public ViewLayer <> {
76+ template <typename T> friend view make_view<T &t>;
77+ };
78+
6579
6680 template <typename T>
6781 static view make_view (T & t)
6882 {
6983 view v;
84+
7085 v._obj = static_cast <void *>(&t);
7186 v._vtbl = vtable<>::make_vtable<T>();
7287 return v;
@@ -105,9 +120,10 @@ struct readable
105120 template <typename BaseViewLayer = ViewBase<vtable<>>>
106121 struct ViewLayer : public BaseViewLayer
107122 {
123+ protected:
108124 using BaseViewLayer::_obj;
109125 using BaseViewLayer::_vtbl;
110-
126+ public:
111127 int read (char * arg0, int arg1) { return _vtbl->read (_obj, arg0, arg1); }
112128 };
113129
@@ -152,11 +168,13 @@ struct readwritable
152168 template <typename BaseViewLayer = ViewBase<vtable<>>>
153169 struct ViewLayer : public writable ::ViewLayer<readable::ViewLayer<BaseViewLayer>>
154170 {
171+ protected:
155172 using BaseViewLayer::_obj;
156173 using BaseViewLayer::_vtbl;
157174 };
158175
159- struct view : public ViewLayer <> {};
176+
177+ struct view : public ViewLayer <> { };
160178
161179 template <typename T>
162180 static view make_view (T & t)
@@ -224,5 +242,9 @@ int main()
224242 char buf[5 ];
225243 wrv.read (buf, sizeof (buf));
226244 printf (" done\n " );
245+
246+ std::cout << " wrv._obj: " << &wrv._obj << std::endl;
247+
248+
227249 return 0 ;
228250}
0 commit comments