我有这个签名的功能(我无法编辑):
void foo(int a,int b, int& c);
我想打电话给它,但我不关心得到c。目前我这样做:
int temp;
foo(5,4,temp);
//temp never used again
我的解决方案似乎很愚蠢。忽略这个论点的标准方法是什么。
答案 0 :(得分:6)
没有。
如果你担心的主要是因为存在temp而污染你当前的堆栈,包装函数......就像:
void foo_wrapper(int a, int b)
{
int temp; foo(a, b, temp);
}
应该足够了。
答案 1 :(得分:4)
我会编写一个重载,将输出参数转换为正常的返回值。我真的不喜欢输出参数,并认为应该避免它们。
int foo(int a, int b) {
int tmp = 0;
foo(a,b, tmp);
return tmp;
}
在你的程序中,你只是这个重载并忽略返回值或使用它。
答案 2 :(得分:1)
这是一个过度设计的解决方案,所以我实际上并不推荐它作为生产代码中的第一个选项。
您可以创建一个类来帮助您轻松忽略这些类型的参数:
template <class T>
struct RefIgnore
{
static inline T ignored_{};
constexpr operator T&() const
{
return ignored_;
}
};
template <class T>
constexpr RefIgnore<T> ref_ignore{};
void foo(int a,int b, int& c);
auto test()
{
foo(2, 3, ref_ignore<int>);
}
答案 3 :(得分:-2)
代替引用,您可以将其作为指针传递
void foo(int a,int b, int *c = NULL);
在通话地点你可以把它作为
foo(5, 6);
或者如果你想传递第三个参数,那么你可以将它作为
int n = 3;
foo (1, 2, &n);