gpt4 book ai didi

c++ - 可重复使用的预处理器 __COUNTER__

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:01 25 4
gpt4 key购买 nike

我正在做一些模板元编程,大部分只是编写我自己的编译时间列表,但我也有一些预处理器魔法,如果可能的话,我想用它来使事情变得更容易。

我想做的是创建仿函数的编译时列表。该部分已完成,但用于简化创建(并添加到列表)的宏尚未完成。

一个简单的例子:

template<typename Functor, typename Tail>
struct node {
typedef Functor head;
typedef Tail tail;
};


template <typename Functor, typename Tail>
struct push_back {
typedef node<Functor, Tail> list;
};

struct unit0 {};

#define AUTO_FUNCTION(name) struct test_functor_##name { \
static void run_test(); \
}; \
typedef push_back< \
test_functor_##name, \
CONCAT(unit, PP_DEC(__COUNTER__)) \
>::list CONCAT(unit, __COUNTER__); \
void test_functor_##name::run_test()


AUTO_FUNCTION(hello) {
...
}

现在,这是可行的,因为我已经为 PP_DEC 创建了大量预处理器宏,即:

#define PP_DEC(x) PP_DEC_I(x)
#define PP_DEC_I(x) PP_DEC_ ## x
#define PP_DEC_1 0
#define PP_DEC_2 1
...
#define PP_DEC_N N

这是我真正想避免的部分,也是我问这个问题的原因。有没有人建议我如何在不增加其值(value)的情况下使用 COUNTER,或者我可以通过其他方式完成类似于以下的计数模式:

 0 1
1 2
2 3
...

当然也欢迎改变 push_back 等语义的建议 :)。

附言。这不是为了生产,只是为了好玩。所以欢迎 GCC 特定的扩展。

PPS。我试图避免外部依赖,例如 boost,因为我想了解我正在做的一切(这个项目的重点)。

最佳答案

您可以使用额外的宏“修复”__COUNTER__ 值:

#define MY_MACRO MY_MACRO_COUNTED(__COUNTER__)

#define MY_MACRO_COUNTED(counter) counter + counter

关于c++ - 可重复使用的预处理器 __COUNTER__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4719568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com