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

楼主: yoco315 (眠月)   2014-06-24 04:17:13
开发平台(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-06-24 04:23:00
似乎可以参考 std::get<type>(std::tuple) 的实作?唔, 仔细看才发现这要 C++14 之后才是标准 @@
楼主: yoco315 (眠月)   2014-06-24 04:32:00
get(tuple) 我会作,但这边有点不一样。get(tuple)的时候很明确知道tuple里面的每一个型别,透过meta-programming可以递回的索引到正确的member,但我现在这个状况是get没有办法知道到底有多少type尝试具现这个函数,手上有的就只有自己一个 T 这个 type @@刚试了一下 C++14 的 variable template,发现只能全域data member 不能是 template XD
作者: worldlet (纯净心灵永恒阳光)   2014-06-24 08:39:00
不能用 union 吗 XD
作者: descent (“雄辩是银,沉默是金”)   2014-06-24 09:45:00
连语法都看不懂
作者: azureblaze (AzureBlaze)   2014-06-24 09:55:00
写工具扫所有用到a.get<T>()的地方建tuple(超大工程要同时123应该一定得跑两个phase?
楼主: yoco315 (眠月)   2014-06-24 10:18:00
azureblaze,有想过,但可惜a.get<T>会在template里面被呼叫而且是template里面的template里面的template里面的..除非我的工具很完整的支援 c++ template 型别推导,不然 qq
作者: azureblaze (AzureBlaze)   2014-06-24 10:22:00
我觉得就是因为太复杂所以variable template不能这样用
作者: loveme00835 (发箍)   2014-06-24 10:24:00
virtual function call 的 cost 可接受?
楼主: yoco315 (眠月)   2014-06-24 10:24:00
我快要放弃了了 XD 最后可能会对 3 妥协
作者: azureblaze (AzureBlaze)   2014-06-24 10:24:00
如果又把他extern或指标传出去那还会更复杂试了一下variant的写法效率好像会更糟http://ideone.com/MMPhYa 至少不用lock static?
楼主: yoco315 (眠月)   2014-06-24 11:12:00
哇!好聪明的手法 XD 竟然用 static variable addr 当 key学起来,ㄎㄎ
作者: carylorrk (carylorrk)   2014-06-24 12:36:00
所以一定要 runtime 来查吗~?
作者: kwpn (ITSST)   2014-06-24 12:39:00
boost variant就是这个效果吧
作者: loveme00835 (发箍)   2014-06-24 12:40:00
我的解法 ideone.com/yzomRg
作者: carylorrk (carylorrk)   2014-06-24 12:53:00
variant 不是类似 union 吗?我有搞错吗XD?版大神解~compile time 就定位的到了
作者: azureblaze (AzureBlaze)   2014-06-24 12:56:00
union只吃POD不过上面的作法非POD都会leak 还是得包层virtual
作者: carylorrk (carylorrk)   2014-06-24 13:05:00
我的意思是 variant 像 union 无法依 type 存不同值吧?不是很懂非 POD 会 leak 的意思@@ 可以请教一下吗XD?没事 我知道了~
楼主: yoco315 (眠月)   2014-06-24 13:58:00
谢谢版主大大 ^^~* 好强...
作者: loveme00835 (发箍)   2014-06-24 14:43:00
@azure 那就会肥一点 xD http://ideone.com/Lh92EU
楼主: yoco315 (眠月)   2014-06-24 14:49:00
我想也许可以直接放在 std::vector<boost::any> XD
作者: suhorng ( )   2014-06-24 14:50:00
现在 union 不是也可以放 non-POD 吗? 只是不好用...
作者: loveme00835 (发箍)   2014-06-24 14:50:00
lol 差点忘了
楼主: yoco315 (眠月)   2014-06-24 15:41:00
不过我需要的是“不同型别,不同实体,同时存在”所以无法使用 union XD

Links booklink

Contact Us: admin [ a t ] ucptt.com