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

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"}


弑天下
浏览 546回答 3
3回答

浮云间

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

狐的传说

我想在很长一段时间内解决这个问题,并提出了一个非常简洁的解决方案。至少我应该有一个upvote试试这个。:))以下库代码实现了命名空间级功能。即我成功实施counter_read和counter_inc;&nbsp;但不是counter_inc_t(由于template函数内部不允许类,因此在函数内部递增)template<unsigned&nbsp;int&nbsp;NUM>&nbsp;struct&nbsp;Counter&nbsp;{&nbsp;enum&nbsp;{&nbsp;value&nbsp;=&nbsp;Counter<NUM-1>::value&nbsp;};&nbsp;};template<>&nbsp;struct&nbsp;Counter<0>&nbsp;{&nbsp;enum&nbsp;{&nbsp;value&nbsp;=&nbsp;0&nbsp;};&nbsp;};#define&nbsp;counter_read&nbsp;Counter<__LINE__>::value#define&nbsp;counter_inc&nbsp;template<>&nbsp;struct&nbsp;Counter<__LINE__>&nbsp;{&nbsp;enum&nbsp;{&nbsp;value&nbsp;=&nbsp;Counter<__LINE__-1>::value&nbsp;+&nbsp;1};&nbsp;}该技术使用模板元编程并利用__LINE__宏。见结果从你的答案代码。
打开App,查看更多内容
随时随地看视频慕课网APP