SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Modern C++入門

関数ポインタとおさらば! Modern C++のラムダ式

第5回 無名関数を使いこなす

  • X ポスト
  • このエントリーをはてなブックマークに追加

ラムダ式を使ってみる

 下準備が長かったのですが、ラムダ式を使ってみましょう。使ってみれば、こんな分かりやすいものはありません。

ラムダ式の定義

 ラムダ式は、以下のように定義します。最初から細かくするとワケがわからなくなるので、最もシンプルな形を紹介します。

[キャプチャ句](パラメータリスト) -> 戻り値の型 { ラムダ式の本体 }

 キャプチャって何?ということはひとまず置いておきまして(あとでイヤ~なテーマのところで出てきます)、パラメータリストとは引数です(パラメータ宣言子とも呼ばれます)。戻り値は分かりますね。ラムダ式の本体は関数の中身です。気になるのは、関数の名前がどこにもないというところでしょうか。と言いますか、キャプチャ句の部分を取って関数の名前を付ければ、普通の関数定義ですね。関数の名前がないので、ラムダ式は無名関数とか匿名関数とも呼ばれます。通常の関数と同様に、引数なしも戻り値なしの場合も記述できます。

 簡単な例でラムダ式を見てみます。もちろん(!)、キャプチャ句は省いてます。

リスト simple_lambda.cpp
auto func = [](int x, int y) { return x * y; };
cout << func(100, 200) << endl;

 整数型の引数xとyを受け取り、その積を返すという単純な関数を定義してfuncに入れています。この場合、戻り値の型を省略しているので、関数定義の戻り値から型推論されます。また、autoで受けることによりラムダ式の型の記述も省略できます。ここは、autoで受けることで型推論の恩恵を受けるのが良いでしょう。funcが、関数オブジェクトを所有することになります。なおC++ 14では、パラメータリストの型にautoを指定することで、ジェネリックな型を渡すことができます。

 関数ポインタの話を思い出してください。ポインタに入った関数を呼び出すときの書式に悩みませんでしたか? ラムダ式では、関数オブジェクトの入った変数をそのまま記述することで、シンプルに関数を呼び出すことができます。

 なお、ラムダ式には属性、例外仕様、mutableを指定できますが、ちょっと難しくなるので簡単に紹介するのみにします。なおmutableは、キャプチャ句と関連があるので、これは後回しにします。

情報を伝える属性

 属性(attribute)とは、コンパイラにソースコードについての情報を伝える構文です。[[attribute]]のように記述します。JavaやC#にもある属性と似たような位置付けと思ってよいかも知れません。属性を指定することで、関数の動作や引数の制約についての情報をコンパイラに与えることができます。C++ 11で[[noreturn]]と[[carries_dependency]]が実装され、その後のC++でいくつかの属性が追加されました(それがどのようなものなのかは本稿とは関連が薄いので省略)。重要なのは、ラムダ式で使える属性です。C++ 23時点で、以下の3つが使えます。

  • [[noreturn]]:関数から戻らないことを示す(C++ 11)
  • [[nodiscard]]:関数の戻り値を必ず受け取る(C++ 17)
  • [[deprecated]]:関数は非推奨であることを示す(C++ 14)

 書いておいて何ですが、日常ではあまり意識しなくてもいいかもしれませんね(最近、この手の新機能ってやたら目につきませんか?)。

例外仕様

 例外仕様(例外指定という場合もあります)とは、関数が何か問題を起こしたときに、どう対応しているか? というのをコンパイラに伝えるためのものです。そういう意味では属性と似ていますね。属性と違うのは、こちらは言語仕様だということです。C++ 11でnoexceptが導入されて、引数とともに以下のように使われます。

  • noexcept、noexcept(true):関数は例外をスローしない
  • noexcept(false):関数は任意の型の例外をスローする

 Javaなんかのthrowsに似ているのかな? と少し思いました。コンパイラが最適化に使用したりするようです。

 ここで、これらを含めたラムダ式の書き方として書式を再掲しておきます。

[キャプチャ句](パラメータリスト) mutable 属性 例外仕様 -> 戻り値の型 { ラムダ式の本体 }

次のページ
クロージャを使ってみる

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Modern C++入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19112 2024/03/14 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング