関数を引数とする関数について


c言語では関数を引数にとる関数を定義できて、

[code]

    double calc1(double a);
    double calc2(double func(double),double a){
        return func(a);
    }
    
[/code]

のようにすれば、

[code]

    calc2(calc1,a);
    
[/code]

という計算ができますが、calc1が2変数関数だったときに、

[code]

    double calc1(double a,double b);
    
[/code]

「calc1のaにある変数を代入した関数」をcalc2に渡すことはできますか？




ご質問のように多引数の関数の一部の引数に値を与えて、より引数の少ない関数を得ることを「部分適用」と言ったりしますが、C言語そのものには部分適用を簡単に表現する機構はありません。(特殊なABIを採用するコンパイラで、比較的簡単にそんなことができるものもあるようですが。)

別に1引数の中間関数を定義する必要があるでしょう。

[code]

    double calc1(double a, couble b);
    
    double calc1partial5(double b) {
        return calc1(5.0, b);
    }
    
    calc2(calc1partial5, a);
    
[/code]

「calc1のaにある変数を代入」の「ある変数」がローカル変数だったりすると、通常のC言語の関数として構成するのは無理だろうと思います。




ご質問のように多引数の関数の一部の引数に値を与えて、より引数の少ない関数を得ることを「部分適用」と言ったりしますが、C言語そのものには部分適用を簡単に表現する機構はありません。(特殊なABIを採用するコンパイラで、比較的簡単にそんなことができるものもあるようですが。)

別に1引数の中間関数を定義する必要があるでしょう。

[code]

    double calc1(double a, couble b);
    
    double calc1partial5(double b) {
        return calc1(5.0, b);
    }
    
    calc2(calc1partial5, a);
    
[/code]

「calc1のaにある変数を代入」の「ある変数」がローカル変数だったりすると、通常のC言語の関数として構成するのは無理だろうと思います。

