[問題] 非靜態,access by type 的 data member
開發平台(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 可以吧
}
};
百思不得其解,盼前輩解惑。
小妹先謝過了。
--
To iterate is human, to recurse, divine.
遞迴只應天上有, 凡人該當用迴圈. L. Peter Deutsch
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.71.74.248
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1403554635.A.FD0.html
推
06/24 04:23, , 1F
06/24 04:23, 1F
→
06/24 04:24, , 2F
06/24 04:24, 2F
→
06/24 04:32, , 3F
06/24 04:32, 3F
→
06/24 04:33, , 4F
06/24 04:33, 4F
→
06/24 04:34, , 5F
06/24 04:34, 5F
→
06/24 04:34, , 6F
06/24 04:34, 6F
→
06/24 04:35, , 7F
06/24 04:35, 7F
→
06/24 04:35, , 8F
06/24 04:35, 8F
→
06/24 04:36, , 9F
06/24 04:36, 9F
推
06/24 08:39, , 10F
06/24 08:39, 10F
推
06/24 09:45, , 11F
06/24 09:45, 11F
推
06/24 09:55, , 12F
06/24 09:55, 12F
→
06/24 10:01, , 13F
06/24 10:01, 13F
→
06/24 10:18, , 14F
06/24 10:18, 14F
→
06/24 10:18, , 15F
06/24 10:18, 15F
→
06/24 10:19, , 16F
06/24 10:19, 16F
→
06/24 10:22, , 17F
06/24 10:22, 17F
→
06/24 10:24, , 18F
06/24 10:24, 18F
→
06/24 10:24, , 19F
06/24 10:24, 19F
→
06/24 10:24, , 20F
06/24 10:24, 20F
→
06/24 10:27, , 21F
06/24 10:27, 21F
推
06/24 10:54, , 22F
06/24 10:54, 22F
→
06/24 11:12, , 23F
06/24 11:12, 23F
→
06/24 11:13, , 24F
06/24 11:13, 24F
→
06/24 12:36, , 25F
06/24 12:36, 25F
推
06/24 12:39, , 26F
06/24 12:39, 26F
推
06/24 12:40, , 27F
06/24 12:40, 27F
→
06/24 12:53, , 28F
06/24 12:53, 28F
→
06/24 12:55, , 29F
06/24 12:55, 29F
→
06/24 12:56, , 30F
06/24 12:56, 30F
→
06/24 13:00, , 31F
06/24 13:00, 31F
→
06/24 13:05, , 32F
06/24 13:05, 32F
→
06/24 13:09, , 33F
06/24 13:09, 33F
→
06/24 13:16, , 34F
06/24 13:16, 34F
→
06/24 13:58, , 35F
06/24 13:58, 35F
→
06/24 14:43, , 36F
06/24 14:43, 36F
→
06/24 14:49, , 37F
06/24 14:49, 37F
→
06/24 14:50, , 38F
06/24 14:50, 38F
→
06/24 14:50, , 39F
06/24 14:50, 39F
→
06/24 15:41, , 40F
06/24 15:41, 40F
→
06/24 15:42, , 41F
06/24 15:42, 41F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):