在没有宏的情况下C++执行此部分函数应用程序的"right"方法是什么?
What is the "right" way to do this partial function application in C++ without a macro?
作为一个简化的例子,假设我从以下代码开始:
void function1 (Object &myObject) {
for (int b = 0; b < 10000; b++) {
// ... a bunch of code that uses the below myFunction(int, int) in different ways
auto x = myObject.myFunction(12345, b);
// do something with x and etc
}
}
我想做的是获取for循环中的内容,将其放在一个单独的内联函数中,并以某种方式授予该函数访问myObject.myFunction(a, b)
的当前版本的权限,在该版本中已经设置了b
。
一种方法是:
__attribute__((always_inline))
inline void function2 (Object &myObject, int &b) {
#define curried(a) myObject.myFunction(a, b)
// ... a bunch of code that uses the below function in different ways
auto x = curried(12345);
// do something with x and etc
}
void function1 (Object &myObject) {
for (int b = 0; b < 10000; b++) {
function2(myObject, b);
}
}
如果您能让编译器成功地内联function2
,那么就可以在没有开销的情况下生成相同的汇编代码。(即使使用__attribute__((always_inline))
,也可能至少需要-O1或-O2,至少需要clang。(
无论哪种方式,在这种情况下使用宏都有点尴尬,并且必须将b
的值从function1
传递到function2
。最好是将lambda函数作为参数传递给function2
,但随后我遇到了捕获问题(您只能传递未捕获的lambda,但我们需要捕获myObject(,以及一些额外的开销。举个例子,我想这样做:
__attribute__((always_inline))
inline void function2 (some_type curried) {
// ... a bunch of code that uses the below function in different ways
auto x = curried(12345);
// do something with x and etc
}
void function1 (Object &myObject) {
for (int b = 0; b < 10000; b++) {
auto lambda = [&](int a) {return myObject.myFunction(a, n);};
function2(lambda);
}
}
但是,除非lambda没有捕获,否则这将失败,因为没有适合"的类型;some_type">
所以我的问题是:
是否有任何正确的方法可以做到这一点,即零开销,至少需要一些最小的优化?
lambda应该完成的工作
auto curried = [&](auto& a) { return myObject.myFunction(a, b);}
或
auto curried = [&](const auto& a) { return myObject.myFunction(a, b);}
是否使用其中一个将取决于函数是否应将a
修改为输入输出参数。如果myObject
或b
在curried
之前超出范围,您应该小心,因为lambda将包含一个悬空引用。
还要注意,Lambda仅在C++11 之后才可用
相关文章:
- 在C应用程序中运行C++(带有STL)函数
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 将数组作为多线程应用程序中函数的返回传递
- 在Qt应用程序中包含Python.h会导致对Qt函数的未定义引用
- 在静态库中声明函数,在使用该相同库的应用程序中定义它
- 用于检索当前正在使用的应用程序的函数
- 从函数应用程序创建 std::vector
- 执行递归函数时 C++ 应用程序崩溃
- 如何在关闭Qt控制台应用程序之前运行我的析构函数?
- 如何处理异步函数中的异常UWP应用程序getFileFrompathAsync(path);
- 为什么使用 nullPtr 调用函数不会使我的应用程序崩溃
- 如何在应用程序正在运行的系统上查看所需的Windows API函数
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- VS2015 应用程序在调用具有委托C++函数时崩溃
- 仅在我退出应用程序后,使用Cout.write()函数在控制台上打印字符串
- Intel Pin调用应用程序中的函数
- c++ 编写一个 cosole 应用程序,您可以从中调用其中定义的函数
- Android本机C 函数呼叫导致应用程序崩溃
- 在QT应用程序中创建并执行函数
- 为在应用程序中作为函数参数传递的文件运行'iconv'命令C++