将默认参数传递给c++函数

Passing default parameter to function C++

本文关键字:c++ 函数 参数传递 默认      更新时间:2023-10-16

我想用默认参数调用函数,或者由我给出,但默认参数是指定的类私有变量,这里简化了示例:

Class::Something
{
public:
    void setI(int i);
private:
    void func(int i = this->i_default, j=this, k=this->k_default, l=this->l_default);
    int i_default; // May be different for different instances.
    int k_default; // May be different for different instances.
    int l_default; // May be different for different instances.
}

所以当我调用func()时,它接受默认的i_variable,或者当我调用func(4)时,它接受4个参数而不改变i_default值。我知道我做错了什么,因为我得到错误:

Error   1   error C2355: 'this' : can only be referenced inside non-static member functions or non-static data member initializer

是否有某种方法可以实现这种行为?

是否有某种方法可以实现这种行为?

使用函数重载(感谢@PiotrSkotnicki):

void func(int i);
void func() { func(i_default); }

你可以声明i_default为const static(感谢@TartanLama)。

const static int i_default=1;

这是工作程序。

也可以使用函数重载。但这比函数重载使用更少的代码!

标准对此非常清楚。您不能在默认参数中显式地使用this。您似乎必须使用重载来实现此结果:

void func(int i);
void func() { func(i_default); }

如果你想降低函数,你可以使用一个哨兵,允许func决定是否使用默认值。最简单的形式:

void func(int* pi = NULL) {
    int i = pi ? *pi : i_default;
    // rest of the function
}

这个方法可以扩展为使用一个助手类:

#include <cstdio>
template <typename C, typename T>
class Defaltable { 
    T val;
    T C::* ptr;
public:
    Defaltable(int C::* p) { 
        ptr = p;
        val = 0;
    }
    Defaltable(T x) {
        val = x;
        ptr = NULL;
    }
    T fetch(C* p) {
        return ptr ? p->*ptr : val;
    }
};
class Foo {
    int i_default;
public:
    Foo(int dflt) {
        i_default = dflt;
    }
    int func(Defaltable<Foo, int> x = &Foo::i_default) {
        return x.fetch(this);
    }
};

int main()
{
    Foo c(42);
    printf("%dn", c.func(1));
    printf("%dn", c.func());
}