C++ の bind 関数は強力2021年04月16日 18時45分43秒

C++ のタプルは使いづらいが、それとは対象的に bind はとても強力。

元々、bind には「拘束」や「束縛」と言った意味がある。プログラムで、何を拘束、束縛するかと言うと、変数と関数をくっつけてしまうのだ。近い使い勝手の物として、関数のデフォルト引数がそれに当たる。関数を作って、処理を抽象化する。変更する頻度の低い引数に初期値を与え、未指定時の値にする。

double root( double value, double base = 2.0 );
例えば、根を求める root 関数は根数を与えないと平方根になる。

初期値の欠点は、後ろから値を設定できないこと。任意の値を自由に渡すことは出来なくなる。例えば、各種三乗根の値を求めたりは出来ないのだ。bind を使うと任意の変数を事前に与えることが出来る。コールバック関数等とも相性が良い。

#include <functional>
#include <iostream>

void print_multiply( double d, int count )
{
    std::cout << d * count << std::endl;
}

int main()
{
    std::function< void( double ) > multi3 =
        std::bind( &print_multiply, std::placeholders::_1, 3 );

    multi3( 4.5 );
}
三乗根ではなく、簡素化した物だが、三倍を求める特別な関数を構築して使い回せる。
% c++ bind.cpp
% ./a.out 
13.5