使用按名称调用传递参数
Passing parameters using call by name
假设我有这样的C++片段:
int A[3] = {0, 2, 1};
void f(int x, int y) {
x++; A[1]--; y++;
print(x, y, A[0], A[1], A[2]);
}
void main() {
f(A[0], A[A[1]]);
print(A[0], A[1], A[2]);
}
我想使用按名呼f()
传递A[0]
和A[A[1]]
。
在这种情况下,打印的结果应该是:1 1 1 2 1 1 2 1
(这是我们老师讲授的编程语言课)。但是,我不明白y
怎么能成为f
对print()
的呼吁中的1。y
不是在开始和更改为A[A[1]]=A[1]=1
之后A[1]--
与A[A[1]]=A[2]=1
绑定吗?在那之后,y++
不会让y
等于 2?
此外,为了使A[1]
在A[1]--
后成为 2 ,它必须以某种方式增加 1,这正是y++
所做的,意思是y++=A[1]++=2
.那么,在f
对print()
的呼唤中,y =/= A[1]
?
当您在 C++ 中将值传递给函数时,它将成为独立值,并且不再引用数组。因此,y
在函数中等于 1,它独立于A['1']
。
在您的示例中,x
和y
是按值传递的,这意味着正在创建值的副本。在f()
内部,x
和y
被视为局部变量,对x
和y
所做的任何更改都不会反映回调用方。如果需要,则需要通过引用传递:
void f(int &x, int &y)
按名称传递的方法是传递函子而不是单个 (int) 参数:
所以,像这样:
template <typename X, typename Y>
void f(X x, Y y) { // or void f(std::function<int&()> x, std::function<int&()> y)
x()++; A[1]--; y()++;
print(x, y, A[0], A[1], A[2]);
}
int main() {
f([]() -> int&{ return A[0];}, []() -> int&{ return A[A[1]];});
print(A[0], A[1], A[2]);
}
演示
一个丑陋的替代方案是宏:
#define f(x, y) do { (x)++; A[1]--; (y)++; print((x), (y), A[0], A[1], A[2]); } while (0)
int main() {
f(A[0], A[A[1]]);
print(A[0], A[1], A[2]);
}
演示
相关文章:
- 当对话框被接受时,如何用参数调用槽
- 使用用户定义的参数调用future/async并调用类方法
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 不允许运算符 const 参数调用 const 成员函数
- 为变量模板的每个参数调用模板函数
- 如何在窗口中使用注入的 dll 中的参数调用函数
- 按引用调用与按指针参数调用的差异 前递增和后递增
- 为什么使用不匹配的参数调用重载函数仍然有效
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 基于枚举参数调用专用模板方法
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 如何使用类模板参数来更改参数调用和函数签名?
- lambda 函数使用其参数作为模板参数调用模板函数
- Android:使用 c++ 中的 byte[] 参数调用 java 方法
- 使用不同的模板参数调用模板类的对象
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 是否可以基于类模板的参数调用类方法和全局方法
- 使用单独的参数调用"boost::process::system()"时,获取"execv
- C++大括号初始值设定项作为参数调用不同的构造函数,然后预期