对于可变长度的函数指针,在C++中使用内联函数或MACROS更好
What is better to use inline functions or MACROS in C++ for variable length function pointers
我有一个应用程序,它有很多功能,可以遍历菜单工具栏的所有元素。
代码看起来像这样:
subMenuDefaultMenuShortcuts( ui->fileMenu );
subMenuDefaultMenuShortcuts(ui->editMenu);
subMenuDefaultMenuShortcuts(ui->windowMenu);
subMenuDefaultMenuShortcuts(ui->helpMenu);
subMenuUpdateLabels(ui->fileMenu,hierarchy);
subMenuUpdateLabels(ui->editMenu,hierarchy);
subMenuUpdateLabels(ui->windowMenu,hierarchy);
subMenuUpdateLabels(ui->helpMenu,hierarchy);
我可能会改变这个实现,或者菜单可以有子菜单。因此,搜索和替换代码不仅不美观,而且可读性差,容易出错。
理想情况下,我会想要这样的东西:
OnAllMenus(functionName,params ...)
所以我的代码看起来像:
OnAllMenus(subMenuUpdateLabels)
OnAllMenus(subMenuUpdateLabels,hierarchy)
OnAllMenus(someFunction,hierarchy,argument1,argument2)
我想使用宏,但不建议使用它们。然而,使用带有函数指针的内联函数似乎会导致一些难以阅读的代码。(我没有看到任何函数指针期望函数的参数数量可变的例子)。
有没有更好/更干净的方法可以做到这一点,而不添加一些过于复杂、不可见的代码。
template<typename FuncPointer, typename ... Args>
void for_all_menus(FuncPointer func, Args ... args)
{
f(ui->foo,std::forward<Args>(args)...);
f(ui->bar,std::forward<Args>(args)...);
// etc
}
// use
for_all_menus(&subMenuLabel, hierarchy);
Pmr的答案,但多变的模板阻止了愚蠢的boost::bind
,它将分散在各处。
您可以使用boost::function
和boost::bind
。
template<typename Func>
void for_all_menus(Func f) {
f(ui->foo);
f(ui->bar);
// etc
}
// use
for_all_menus(boost::bind(subMenuLabel, _1, hierarchy));
// with variadic templates
template<typename Func, typename Args...>
struct for_all_menus {
Func f;
void operator()(Args&&... args) {
// umh, I always mess up the syntax
// you might want to double check this
f(ui->foo, std::forward<Args>(args)...);
}
};
template<typename F>
for_all_menus<F> make_for_all_menus(F f) { return for_all_menus<F>{f}; }
// use
auto f = make_for_all_menus(subMenuLabel);
f(hierarchy);
如果你需要更动态的东西,只需更换函数模板,该模板具有采用CCD_ 4的函数。你当然也可以使用C++11等同物和lambda。
如果您想将菜单列表放在一个位置并使用该列表在不同的地方,我推荐Boost.Preprocessor。但你可能在诉诸它之前要三思而后行。
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 在类的第一个/最后一个实例存在之前/之后调用一对函数.有没有更好的方法?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 对于可移动类型,按值传递比重载函数更好吗?
- 函数的返回是 LPVOID 或更好的指向列表的指针
- 重新定义要在函数中使用的静态变量 - 有没有更好的方法?
- 除了使用 clock() 函数之外,有没有更好的方法来以给定的频率生成/发布数据
- 在构造函数中组织初始值设定项列表的更好方法
- 使用成员函数更改对象或返回并分配它是否被认为是更好的做法?
- 需要一种更好的方法来编写电源函数
- 哪种 c++ 构造函数样式更好
- 有没有更好的方法可以从静态和非静态函数返回相同的字符串文本
- Curly Braces构造函数更喜欢initializer_list而不是更好的匹配.为什么
- 哪一个更好?使用C 代码中的System()函数或使用源代码
- 这是检查 const 函数(如果是否创建某些内容)的更好方法
- 为白名单类型约束模板函数的更好方法,SFINAE
- 调用包含所有所需代码的函数或内部包含所需代码的其他函数的函数更好?
- 是将基类强制转换为派生类更好,还是在基类上创建一个虚拟函数更好