Re: [问题] 非静态,access by type 的 data member

楼主: chubiei (:))   2014-07-01 00:44:21
版大的写法太隐晦了
其实这边需要的是动态的type注册系统
http://ideone.com/oPvexQ
这边的 TypeRegistry 其实相当于版大用的 maximum size:
版大的作法是每加入一个新的type
底下的memory array会利用 maximum size以及sizeof(value)自动调整
因此这边可以显而易见一个问题就是
当多个Foo instance存在 而且每个instance需要存放不同的type object的话
底下的memory array会产生浪费
而且使用char array会遭遇到麻烦的constructor/destructor问题
需要再写其他code去包装
相反 利用TypeRegistry的作法
将 type <-> id 的 index 和存放 value 的 Foo 本身做脱勾
每一个 type 都会拿到自己独特的 id
Foo 本身只要处理好依照 id 存取的 code 即可
因此这边可以看情况看随意代换底下的 value store:
如果将 value store 换成是 vector 就会 fallback 成版大的 code
浪费一点空间 但是存取是 O(1)
这边是用 map 完全不会浪费空间 但是存取是 O(lg N)
※ 引述《yoco315 (眠月)》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: Standard C++11 or beyond
: 问题(Question):
: 想要请各位大大,是否存在一种手法,
: 能让我以 type 来 access data member?
: 会想要用 type 来存取,是因为我根据不同的 type 需要存取到不同的值,
: 但因为是 template,到底会有哪些 type 其实我不确定。
: 举个例子来说
: struct Foo {
: template <typename T>
: T& get() {
: static T v;
: return v;
: }
: }
: 这样我就可以透过下面这种手法来“模拟”用 type 来存取 data member
: Foo a;
: a.get<int>() = 5;
: a.get<int>()++;
: std::cout << a.get<int>() << std::endl; // 印出 6
: a.get<float>() = 3.14;
: std::cout << a.get<float>() << std::endl; // 印出 3.14
: 这个方法的缺点,是这些模拟出来的 data member 一定都是 static 的
: 因为当我
: Foo a;
: Foo b;
: a.get<int>() = 5;
: std::cout << b.get<int>() << std::endl; // 印出 5
: 那我现在很想知道有没有一种手法可以让我同时满足下面三个条件:
: 1. 可以透过 type 来自动的生成 data member
: 当然,会有哪些 type,在 compile time 就已经确定
: 但使用可以不用明确指定会有 int, float, Bar, 等等
: 要像上面那种例子一样,compiler 要能自己蒐集所有的使用点
: 2. 要是 non-static 的!
: a.get<X>() 跟 b.get<X>() 要是不同人
: 3. 要有效率,希望能避开下面这种作法
: struct Foo {
: template <typename T>
: T& get() {
: static std::map<Foo*, T> m;
: return m[this]; // 既然是 static,那我透过 this 来 map 可以吧
: }
: };
: 百思不得其解,盼前辈解惑。
: 小妹先谢过了。
作者: LPH66 (-6.2598534e+18f)   2014-07-01 01:14:00
ID 的话或许可以学一下 LLVM 的做法, 它用一个 class static的成员变量的指标当 ID, 初始化时会向子类别要一个这种指标因为该变量是各类别独有, 其位址就是一个方便的索引

Links booklink

Contact Us: admin [ a t ] ucptt.com