何もしなくても、クラスのメソッドと通常の関数が同じように扱える
クラスのメソッドだろうが、関数だろうがそこんとこ区別しないいF#さん素敵ですという話。
以下の例は、Hogeクラスのメソッド(func)を、関数gを引数に取る関数fに対して、hoge.funcを突っ込んでもちゃんと動くぞという確認。
> type Hoge() = member this.func x = x + 1 type Hoge = class new : unit -> Hoge member func : x:int -> int end > let f g = g 10 val f : g:(int -> 'a) -> 'a > f (fun x -> 3*x) val it : int = 30 > let hoge = new Hoge() val hoge : Hoge > f hoge.func val it : int = 11
これをC++でやろうとするとおまじないが必要になり、僕はもうおうちに帰りたい気持ちでいっぱいになるので超ありがたい。
C++で書くとこんな感じか?std::functionは中でType Erasure使ってて遅いっていうし、どうすりゃいいのかよくわかりません。
#include<iostream> #include <functional> class Hoge { public: int func(int x){ return x + 1; } }; int f(std::function<int(int)> g){ return g(10); } int main() { Hoge hoge = Hoge(); std::cout << f(std::bind(&(Hoge::func), &hoge, std::placeholders::_1)) << std::endl; std::cout << f([](int x){ return 3 * x; }) << std::endl; return 0; }