アピリッツの知識共有サイト「ナレッジベース」で公開されている内容をアピスピでも紹介します。こちらはES部のクライアントエンジニア・足立雅史さんによる記事です。
クライアントのゲーム開発において、 2大フレームワークにUnityとUnreal Engineがありますが、
この2つのフレームワークで異なるところは実装言語です。
UnityはC#で、Unreal EngineはC++なのですが、 そのラムダ式の記法の違いについて説明します。
ラムダ式とは
ある手続き(処理)のかたまりをオブジェクトのように扱える「関数オブジェクト」があります。
以下のコードだとfunc_obj
や f_lambda
が関数オブジェクトです。func_obj
にはprint_number
という関数が代入されていますが、f_lambda
にはその場で記述された無名の手続きが代入されています。
この名前付けされずに定義された関数を「ラムダ式」と呼んでいます。
#include <iostream>
#include <functional>
void print_number(const int i) {
std::cout << i << std::endl;
}
int main() {
std::function<void(int)> func_obj = print_number;
// 実行したら3と表示される
func_obj(3);
std::function<void(int)> f_lambda = [](int i) {
std::cout << i < std::endl;
};
// 実行したら5と表示される
f_lambda(5);
return 0;
}
ラムダ式の記法を比較
最近までUnityでC#を使って開発してきたのでC++と違いを調べていました。
型表現として、C++ではstd::function
を用いますが、C#では System.Action
やSystem.Func
を用います。
比較しやすいように一覧表を書いてみました。
C++ | C# | 関数表現 |
---|---|---|
std::function<void()> | System.Action | void func() |
std::function<void(int)> | System.Action<int> | void func(int i) |
std::function<bool(void)> | System.Func<bool> | bool func() |
std::function<bool(int,double)> | System.Func<int,double,bool> | bool func(int, double) |
std::function<int(int)> a = [](int x) {return x + 1;}; | System.Func<int,int> a = x => x + 1; |