なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

C++のbindはちょっと面白そうだった

Stackoverflowにて面白そうな問題を発見。

stackoverflow.com

というのは、今の自分の課題として関数を関数に渡してその結果を受け取りたいというものがあったのだ。Scalaだと関数オブジェクト渡すか、ラムダ式渡す感じでかるーくやれるのだが。C++の場合、記法が謎いのと、インスタンスの関数を呼び出したいという要望が自分の中であったため、思いついても実現できていなかった。

・コード
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

#include <iostream>
#include <functional>

// std::bindの定義にplaceholdersが使えるようだ
using namespace std::placeholders;

class aClass
{
public:
    // 引数を2つ取る簡単な関数
    void test(int a,int b)
    {
        printf("%d-%d=%d\n", a, b, a - b);
    }
};

int main()
{
    aClass a;
    // オブジェクトのインスタンスを渡して、関数のポインタにする
    auto fp = std::bind(&aClass::test, a, _1, _2);

    // めっちゃ呼べる!
    fp(7700, 3900);
    fp(500, 300);

    return 0;
}