为了账号安全,请及时绑定邮箱和手机立即绑定

C ++是否支持编译时计数器?

C ++是否支持编译时计数器?

C++
弑天下 2019-08-12 16:03:30
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贡献1829条经验 获得超4个赞

我相信MSVC和GCC都支持一个__COUNTER__预处理器令牌,它在其位置上取代了单调递增的值。


查看完整回答
反对 回复 2019-08-12
?
狐的传说

TA贡献1804条经验 获得超3个赞

我想在很长一段时间内解决这个问题,并提出了一个非常简洁的解决方案。至少我应该有一个upvote试试这个。:))

以下库代码实现了命名空间级功能。即我成功实施counter_readcounter_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__宏。见结果从你的答案代码。


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 545 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信