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 关注
- 545 浏览
添加回答
举报
0/150
提交
取消