- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想破坏传递给宏的名称以将其用作函数名称。例如,我有一个名为 foo
的宏,如下所示:
#define foo(name) void name(const string& in) { \\do something }
但我希望使用像这样的参数调用此宏 foo(Bar::do)
所以我必须将名称更改为正确的名称才能将其用作函数。
有什么办法可以实现吗?我使用 c++11 和 g++5.x。
编辑:
我遇到的问题是因为有一个旧版本的宏,它可以不受限制地使用,所以现在我的代码中有很多部分使用宏,例如 foo(Bar: :do)
,但现在我必须使用这些名称生成一个函数,但函数名称必须是独特的,所以我决定使用宏输入参数作为函数名称,但我遇到了我解释的问题。
这是一个例子:
void Bar::do(some_parameters)
{
FOO(Bar::do);
}
这是我之前的代码部分,现在我想在这部分上面添加第二个宏,如下所示:
FOO2(Bar::do)
void Bar::do(some_parameters)
{
FOO(Bar::do);
}
两个名称必须相同,但 FOO2
必须根据输入参数生成一个函数。
编辑2:
我这里尽量把问题解释的更准确一些。之前,我有一个这样的宏:
#define FOO(name) \
some codes here
但现在我希望有一个能够如下扩展的宏:
#define FOO2(name) void proper_fcn_name(name)(const string &name){ do the same thing here}
#define FOO(name) proper_fcn_name(name)(#name)
我可以这样使用它:
FOO2(some_name)
void Bar::fcn()
{
FOO(some_name);
}
如果 some_name
的格式为 Bar::fcn
我希望 proper_fcn_name
将其更改为例如 Bar_fcn
。最后我希望有这样的东西,如果 some_name
是 Bar::fcn
:
void Bar_fcn(const stirng& name) { }
void Bar::fcn()
{
Bar_fcn("Bar::fcn");
}
我必须提到 Bar::fcn
只是一个名称,但我必须考虑这一点,因为我的库用户以前使用过这种样式。
最佳答案
我对您的问题很感兴趣,并做了以下示例:
#include <iostream>
#include <string>
using namespace std;
#define foo(name) void name (const string& in) { cout << in << endl; }
// function with name bar_do
foo(bar_do)
// function with name bar_do
foo(do_bar)
int main(void)
{
bar_do("The first test");
do_bar("The second test");
}
事实上它有效(它是输出),
The first test
The second test
但我不明白你想从宏定义的奇怪用法中得到什么 - 现在这看起来像是用于生成具有不同名称的相同函数的自动复制粘贴方法。
更新
如果您真的想使用命名空间(例如 Bar
),请考虑以下示例:
#include <iostream>
#include <string>
using namespace std;
#define foo(name) void name (const string& in) { cout << in << endl; }
namespace Bar{
void func(const string& in);
}
foo(Bar::func)
int main(void)
{
Bar::func("The special test");
}
你应该明白,命名空间是必须定义的,do
是C++语言的关键字(所以,你不应该将它用作函数名)
更新 2
如果可以将旧代码中的 FOO(Bar::do);
更改为 FOO(Bar,do);
,则可以简单地替换为为调用和定义生成 Bar_do
标识符:
#include <iostream>
#include <string>
using namespace std;
#define defgen(class_name,method_name) void class_name##_##method_name(const string& in) { cout << in << endl; }
#define callgen(class_name,method_name,...) class_name##_##method_name(__VA_ARGS__);
// produses definition
defgen(Bar,do)
int main(void)
{
// produces call with particular value as an argument
callgen(Bar,do,"The call test");
}
kfsone 说(在对您的问题的评论中):
MYMACRO(A::b) might produce A_b_stub
但不幸的是,我不知道如何(并且假设这是不可能的)用其他字符(例如 _
)替换 ::
。
关于c++ - 转换宏参数名称以在 C++ 中用作函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38711986/
我有以下查询: SELECT I.InsuranceID FROM Insurance I INNER JOIN JobDetail JD ON I.AccountID = JD.AccountID
我想在 SwiftUI 布局中将此函数用作具有不可变值的模板,但得到错误 Result of call to 'padding' 未使用: func keys (padding: CGFloat, t
直到最近我才使用 View 的标签元素,此后发现了一些很酷的用途。我遇到了一个不寻常的问题,希望有人能回答。这可能比 Android 更通用,但我不确定。它与 Java 如何处理 Integer 类有
这个问题在这里已经有了答案: What is the purpose of the var keyword and when should I use it (or omit it)? (19 个回
我有以下脚本(见下文)。我有两个问题: 1.在 Knockoutjs 的上下文中,下面这行是什么意思? ko.observable(null); 2.如何调用这里尚未定义的函数: that.activ
Java 社区中是否存在一种使用 with-repect-to 在方法中使用多个返回的思想流派,如下所示: public SomeClass someMethod(int someValue) {
我一直在尝试为我的网站创建一个小型社交媒体栏。出于某种原因,我无法计算出我想用来创建 Sprite 的图像无法加载。我还应该提一下,我在背景图像不显示方面遇到过类似的问题。 HTML调用是这样的:
我正在尝试使用 std::pair 枚举值作为 unordered_map 容器的键,但我在定义自定义哈希函数时遇到困难。 我尝试了以下方法: // Enum and pair declaration
我正在学习 JS/JQuery 以及匿名函数和闭包。我见过这样的例子: $('.button').click(function(){ /* Animations */ /* Other
我正在尝试使用菜单列表来浏览我的应用程序。尽管应用程序和路由运行良好,但我使用这段代码在控制台中收到了一些警告: {props.itemList.map((item, index) =>(
我只是想创建一个简单的测试,我在其中使用 DelegateHandlers 来实例化一个 HttpClient 而无需引入 Asp.net Core 包。我有 2 个删除处理程序 Throttling
我是answering another question在这里,用户有一个 ListView与 ItemsSource包含 UserControls .我说我不会推荐它,并被问为什么。 这真的让我很惊
我安装了3.5.2和 3.5.3使用 pyenv 的版本。 # pyenv versions * system (set by /usr/local/pyenv/version) 3.5.2
我正在使用 android studio 制作统一插件,但这里有问题。一些 SDK 提供仅使用 AppcompatActivity 来制作 fragment 但我的MainActivity , 正是
我在 Laravel 中使用 whereHas 来构建查询: })->whereHas('results', function ($query) use ($issued, $mode, $reque
我有一个 5Gb .dat 文件(> 1000 万行)。每行的格式如 aaaa bb cccc0123 xxx kkkkkkkkkkkkkk或 aaaaabbbcccc01234xxxkkkkkkkk
我有一个消费者类,它采用 NSInputStream 作为参数,它将被异步处理,并且我想推送来自生产者类的数据,该生产者类要求它提供 NSOutputStream 作为其输出源。现在我如何设置一个缓冲
我正在尝试使用 ENVs在 Symfony2 中设置我的参数。标量值很简单,但我有一些参数是数组,我需要使用 ENV 以某种方式设置它们。 有问题的参数: parameters: redis.se
在我的类作业中,我已经成功地做到了这一点,但只是在非常简单的程序中。今天,我有一个更复杂的程序,在我将 DEBUG 定义为一个符号后,Eclipse 做了可怕的笨拙的事情,并且在我删除定义后这些可怕的
我目前有 2 个复选框类别、一个下拉列表和一个表单中的提交按钮。该按钮应保持“禁用”状态,直到选中 A 类的一个复选框和选中 B 类选项之一并选择选择列表中的一个选项。它适用于复选框(当我在没有列表的
我是一名优秀的程序员,十分优秀!