首页 > 解决方案 > 如何通过指向另一个函数返回的函数的指针调用具有默认参数的函数?

问题描述

我有Mult, Add, Div, Sub, Mod接受两个整数并返回其参数结果的函数。还有一个函数Calc,它将一个字符作为 anOperator并返回一个指向函数的指针,该函数返回一个整数并接受两个整数参数,如Mult.

但它不适用于指向函数的指针:

int Add(int x, int y = 2) { // y is default
    return x + y;
}

int Mult(int x, int y = 2) { // y is default
    return x * y;
}

int Div(int x, int y = 2) { // y is default
    return y ? x / y : -1;
}

int Sub(int x, int y = 2) { // y is default
    return x - y;
}

int Mod(int x, int y = 2) { // y is default
    return y ? x % y : -1;
}

using pFn = int(*)(int, int);


pFn Calc(char c) {
    switch (c) {
        case '+':
            return Add;
        case '*':
            return Mult;
        case '/':
            return Div;
        case '-':
            return Sub;
        case '%':
            return Mod;
    }
    return Mult;
}

int main(int argc, char* argv[]){

    pFn func = Calc('%');
    cout << func(7, 4) << endl; // ok
    //cout << func(7) << endl; // error:  Too few arguments
    cout << Mult(4) << endl; // ok. the second argument is default

    func = Calc('/'); // ok
    cout << func(75, 12) << endl; // ok

    std::cout << std::endl;
}

上面如果我Mult用一个参数调用它可以正常工作,因为第二个参数是默认的,但通过指针调用它func会失败。func 是指向函数的指针,它接受两个整数并返回一个 int。

标签: c++function-pointersdefault-arguments

解决方案


默认参数是一点 C++ 语法糖;当使用不足的参数直接调用函数时,编译器会插入默认值,就好像调用者已显式传递它一样,因此仍会使用完整的参数调用函数(Mult(4)编译成与本例相同的代码Mult(4, 2))。

默认值实际上并不是函数类型的一部分,因此您不能将默认值用于间接调用;语法糖在那里分解,因为一旦您通过指针调用,有关默认值的信息就会丢失。


推荐阅读