C ++是否支持編譯時計數器?出于內省的目的,有時我想自動為類型或類似的東西分配序列號。不幸的是,模板元編程本質上是一種功能語言,因此缺乏實現這種計數器的全局變量或可修改狀態。或者是嗎?按請求的示例代碼:#include <iostream>int const a = counter_read;counter_inc;counter_inc;counter_inc;counter_inc;counter_inc;int const b = counter_read;int main() {
std::cout << a << ' ' << b << '\n'; // print "0 5"
counter_inc_t();
counter_inc_t();
counter_inc_t();
std::cout << counter_read << '\n'; // print "8"
struct {
counter_inc_t d1;
char x[ counter_read ];
counter_inc_t d2;
char y[ counter_read ];
} ls;
std::cout << sizeof ls.x << ' ' << sizeof ls.y << '\n'; // print "9 10"}
3 回答
狐的傳說
TA貢獻1804條經驗 獲得超3個贊
我想在很長一段時間內解決這個問題,并提出了一個非常簡潔的解決方案。至少我應該有一個upvote試試這個。:))
以下庫代碼實現了命名空間級功能。即我成功實施counter_read和counter_inc; 但不是counter_inc_t(由于template函數內部不允許類,因此在函數內部遞增)
template<unsigned int NUM> struct Counter { enum { value = Counter<NUM-1>::value }; };template<> struct Counter<0> { enum { value = 0 }; };#define counter_read Counter<__LINE__>::value#define counter_inc template<> struct Counter<__LINE__> { enum { value = Counter<__LINE__-1>::value + 1}; }該技術使用模板元編程并利用__LINE__宏。見結果從你的答案代碼。
- 3 回答
- 0 關注
- 600 瀏覽
添加回答
舉報
0/150
提交
取消
