gpt4 book ai didi

c++ - 仅适用一次的宏

转载 作者:行者123 更新时间:2023-12-02 18:57:25 25 4
gpt4 key购买 nike

是否可以编写一个无论嵌套多少次都只应用一次的宏?

// how to implement this properly?
#define FOO(x) hello(x) // incorrect, works only for 1 level of nesting

// desired use below
void hello(int x);
FOO(x); // expanded to "hello(x)"
FOO(FOO(x)); // also expanded to "hello(x)", not "hello(hello(x))"
FOO(FOO(FOO(x))); // also expanded to "hello(x)"

是否有任何替代方案来实现 FOO,也许不是作为宏,而是一些可以达到相同效果的 C++ 模板?


为什么我需要这个?

我正在编写 clang libTooling 源到源的转换,将一些变量使用到我自己的包装器中。例如,我有以下代码片段:a[3] = 5;

它被转换为hello(a)[3] = 5;并且hello的含义和行为由我控制。但是,如果我有以下代码片段

#define A a[3] 
A = 4;
A = 5;
A = 6;

然后由于 clang libTooling 的限制,我必须向宏体添加更改,如下所示:

#define A hello(a)[3] 
A = 4;
A = 5;
A = 6;

不幸的是,这并不容易实现,因为模式匹配了3次,并且在一般情况下如何区分它们并不明显,所以一切都像这样结束:

#define A hello(hello(hello(a)))[3] 
A = 4;
A = 5;
A = 6;

这显然不是我想要的,所以我正在寻找解决方法。我希望设计一些像FOO这样的宏能够以最少的努力解决这个问题。

最佳答案

您可以根据参数类型重载函数。对于特殊类型,您可以直接转发它,仅在提供实际参数时调用该函数。

void hello(int x);

struct FOO_hello_called {};
FOO_hello_called FOO(int x) {
hello(x);
return {};
}
FOO_hello_called FOO(FOO_hello_called s) {
return s;
}

int main() {
int x = 1;
FOO(x); // calls "hello(x)"
FOO(FOO(x)); // calls "hello(x)" once
FOO(FOO(FOO(x))); // also calls "hello(x)" once
}

关于c++ - 仅适用一次的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66010355/

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