Gaming Life

一日24時間、ゲームは10時間

私は大学院に進まないけど理系は基本大学院進んだほうがいいよって話

最近は大学卒業間近で引っ越し準備を進めなければならない&来週学会発表が控えていることもあり、非常に忙しい日々が続いている。ただ、大学の仕事に追われ続け苦しい日々が続いているというわけではない。Prime Videoで鬼滅の刃を見たり、本を読んだり……。また、年始にはインド・コルカタで開催された国際学会に参加した。

遊んでる画像しかねぇ……

実はこれが自身初の海外旅行。まさか人生初の海外がインドになるとは夢にも思っていなかった。助手という立場での参加であったこともあり、気楽に街の中を丸一日観光していられる程には楽しむことができた。

雑談終わり。

大学院のススメ

冒頭でも触れたが、現在地方駅弁大・工学部の大学四年生の私は、今年の3月に卒業予定である。国立大の理系というと、一般的に大学院に進むことが多い(例:岐阜大学の機械工学科は大学院進学率8割超え)。そんな中私が就職という選択をとったのは、ひとえにゲーム会社に内定を頂けたからである。

ai-gaminglife.hatenablog.com

入学時点でゲーム会社への就職をひとつの目標としていた自分が、学部時点でゲーム会社に内定を頂いてしまってはそりゃ大学院進学という選択が消えるに決まっている。

就職という選択自体に後悔はないし、なんなら研究室配属直後はみんな大学院なんか行かずに就職すればいいのにと思っていた。しかし、1年間通して研究に取り組み、何度か学会に参加した今、考えは変わっている。

ほぼ全ての理系大学生は、大きな理由がない限り大学院に進むことを勧める。

研究とは本来何年もかけて一つのことを追求してようやく成果を得られるもの。それなのに素人の大学生が一年間で成果を得ることは困難である。実際自分も、今取り組んでいる研究は中途半端なまま、まだ顔も知らぬ後輩に託さねばならないことが確定している。おまけに就活は、一般的に研究室正式配属前の大学3年の冬から始まるそんなズブの素人を「高度な理系教育を受けた人材」として企業は採用してくれない。理系として評価してもらいたいのなら、基本的には、大学院に進まねばならない。

大学院に進むメリットはまだある。国際学会を始め、個人ではまず行けないところに、大学のお金で参加することができる。

当然学会に参加するには、事前に険しい研究生活と論文執筆を、授業を受けながら続けなければならない。だが、学会に参加することで、貴重な体験をすることが可能だ。

(ちなみに学部生ながらインドの国際学会に連れて行ってもらえたのは人手不足など色々複雑な事情がありまして……)

研究室選択の基準はテーマ<教授の人柄

よく言われることだが、研究室選択で重視すべきは、「研究テーマ」よりも「教授の人柄」である。これは他の研究室に配属された同期の話を聞いてしみじみ感じている。

全くもって興味の持てない研究なら別だが、多少なり興味がある研究テーマで、人柄の良い教授の研究室と、研究テーマに非常に興味があるが人柄最悪の教授の研究室を比較すれば、選ぶべきは前者だ。教授の性格が悪いと、いくらやりたい研究でも人間関係で悩まされ、高いモチベーションを保つことができない。

なお、研究室配属前の学部生が勘違いしがちなのは、教授が熱心・講義が厳しい=ブラック研究室だと思ってしまうことである。これは必ずしもイコールではない。熱心なのは、面倒見が良いからだったりする。拘束時間が長いと思っているのは、単に所属している学生が高いモチベーションで研究に取り組んでいるだけなのかもしれない。私は時々「研究室が辛いー」だの「論文修正が終わらない」だのでぼやいているのは、いい意味で教授の面倒見がいいせいである。

ちなみに、個人的なブラック研究室の基準は、

教授の性格最悪・拘束時間長い > 教授が学生の面倒をほとんど見ない放置系研究室 > 拘束時間が極端に長い研究室

放置系研究室は非常に厄介。他所から放置系であることに気づくのは困難であり、かつわかり易いパワハラを受けているわけではないので大学に通報しても中々動いてもらえない。放置系研究室を避けたければ、事前に教授ではなく所属している学生に話を聞くべきである。

終わりに

色々言ってみたが、所詮私は学部で卒業する人間。大学院に進むか悩んでいる人は、実際に大学院生に話を聞いてみたりするべき。これから研究室配属が待っている後輩らが良い研究室に配属され、満足いく研究生活が送れることを祈ります。

最近読んだ本・漫画を振り返る 2019/11・12月編

月1更新のノルマをすっかり忘れてたのでFGO特番が始まるまでのこの時間で急いで更新。

IT系

ゲーム制作者になるための3Dグラフィックス技術

ゲーム制作者になるための3Dグラフィックス技術 改訂3版

ゲーム制作者になるための3Dグラフィックス技術 改訂3版

ゲームグラフィックだったりGPUだったりを日本語で調べると必ず一度は目にすることになる西川善司さんの最新作。実はまだ半分くらいしか読めていない。

3Dゲーム黎明期から始まりDirectX12世代までの技術を一通りかいつまんで学べる。数式は殆ど出てこないので読みやすい方だが、ある程度バックボーンとなる知識がないと理解は困難。CGエンジニア検定のコンピュータグラフィックスあたりを読んでからこの本に手を出すとちょうど良い。読み切ったら高いけどリアルタイムレンダリングに手を出そうと思う。

コンピュータグラフィックス [改訂新版]

コンピュータグラフィックス [改訂新版]

  • 作者:
  • 出版社/メーカー: 画像情報教育振興協会
  • 発売日: 2016/09/20
  • メディア: 単行本

リアルタイムレンダリング 第4版 (Real Time Rendering Fourth Edition 日本語版)

リアルタイムレンダリング 第4版 (Real Time Rendering Fourth Edition 日本語版)

ビジネス書

FACT FULLNESS

どこの本屋に行っても一番目立つところに置いていたのでそれなら、と買った。今年読んだ本のベスト3には入る。嘘に騙されてしまう、事実を曲解してしまうような人間の本能を、元医者である著者の興味深い体験談から説明し、その誤りをファクト(事実)を以って否定していく。SNS時代に生きる我々がぜひ読んでおきたい一冊であった。

具体と抽象

具体と抽象 ―世界が変わって見える知性のしくみ

具体と抽象 ―世界が変わって見える知性のしくみ

  • 作者:細谷 功
  • 出版社/メーカー: dZERO
  • 発売日: 2014/11/27
  • メディア: 単行本(ソフトカバー)
Twitterでバズってて,つい勢いで買ってしまった。負のイメージを持たれがちな抽象・抽象論の重要性を説いている。就職する前に読んでおいてよかったと心から思える一冊。1年後、会社で後輩が出来る頃にもまた読みたい。ほぼ同時期に読んでいた、後述の理科系の作文技術と通ずるものがあって面白かった。

理科系の作文技術

理科系の作文技術 (中公新書 (624))

理科系の作文技術 (中公新書 (624))

学会提出用の論文を書いてるし、読まないわけにはいかなかった。かなり前に書かれた本故、たとえや言い回しに古臭さを感じるものの、一生通用する作文技法を学べる。恐らく生涯何度も読み返すことになると思う

その他一般書

桜井政博のゲームについて思うこと

桜井政博のゲームについて思うこと 2015-2019

桜井政博のゲームについて思うこと 2015-2019

ごめんなさい。桜井さんがファミ通で連載持っているのを最近知りました……天才ゲームデザイナー(という肩書でいいんだろうか?)の恐ろしさを思い知った。ステージで即興で話した内容を殆ど暗記してるのおかしいでしょ……

漫画

オレが私になるまで

オレが私になるまで 1 (MFC)

オレが私になるまで 1 (MFC)

個人的The TS漫画 of the year 全年齢版。TS好きはとにかく読め。

SPY×FAMILY

SPY×FAMILY 1 (ジャンプコミックスDIGITAL)

SPY×FAMILY 1 (ジャンプコミックスDIGITAL)

今年の漫画賞を総ナメした化け物。ジャンプ+で追っかけてる。最早私から説明することはあるまい。

まとめ

大学に入ってから、CS系の技術書と漫画ばかり買い漁っていて、売れ筋のビジネス書(ホリ○モン)とかクソとか思っていたのだが、気が向いて買ったFACT FULLNESSが面白くて、ビジネス書にも手を出せるようになったのは成長。この調子で技術書ばかりではなく小説等もたくさん読んでいきたいなあ。

技術書はこの二ヶ月大量に買ってしまったので、暫くは積ん読消化フェーズ。そんなこと言いつつ3月4月にまた新しい本買いそう。ゲーム系やPG言語の解説書だけでなく、OSなど低レイヤの本や、数学系の専門書にも手を出していきたい。

Notionをメモツールとして1ヶ月使い倒したので学生・PG目線でレビューしてみる

弊ブログで何度か紹介しているAsciidoc。markdownより高い表現力に、充実したドキュメント、VSCodeのAsciidoc用拡張機能の使いやすさから、一年近くメモから趣味開発プログラムの仕様書、大学のレポートの執筆に積極的に利用していた。

ai-gaminglife.hatenablog.com

ただこのAsciidoc、文法がやや複雑で覚えにくい為markdownほどお手軽には書けず、テーブルなど小難しいことをしようと思うと毎回公式wikiを見ながら書いていた。 というわけでAsciidocからの移行先を探していたら、notionというアプリに出会った。

www.notion.so

一ヶ月くらい使い倒した結果、メモツールとして非常に優秀で、これ無しで学業・開発やってられないってくらいに優れたアプリだったので紹介。

Notionとは

一言でいうと、markdownでの記述が可能な、Evernoteの超強化版メモツール。ノートをとったり、Trelloのようなタスク管理をしたり、ToDoリストを作ったり、簡易テーブルでデータを管理したり、wikiのような運用をしたり、これらを複数人で共有したりできる。公式サイトにもある通り、多種多様で複雑化するメモ・タスク管理ツールをこれ一つにまとめてしまうことができる。

ここがすごいよnotion

  • 見た目が洗練されている

毎日使うようなツールは、使いやすいことは大前提として、やはり見た目も重要。その点Notionはモダンでシンプルな、美しいデザインになっている。

f:id:ai_gaminglife:20191128000429j:plain

要素を横に並べたり、絵文字を使ったりして見やすいページを自分でつくることができる。

  • Web Clipping対応

f:id:ai_gaminglife:20191128000442j:plain

ChromeFirefox拡張機能を使えば、Web Clippingを使って、画像のように気になった記事を貯めていくことが可能。

  • DataBase機能が凄まじい

Notionを使ってて一番すごいと思う機能。例えば先程のWeb Clipping。ちょちょっと操作してやると、

f:id:ai_gaminglife:20191128000536j:plain

このようにリスト形式の表示に変えることができる。他にもTrelloのようなカンバン形式にしたり、テーブルにすることもできる。テーブルは、簡易的ながら数式を利用することができる。

私はこの機能を使ってプレイしたゲームや読書の記録をつけている。

f:id:ai_gaminglife:20191128000559j:plain

  • 複数人での同時編集

実際に使ったことはないが、複数人で一つのワークスペースを編集することが可能。だれがどこを編集したかは一定数履歴が残るし、ページごとに公開範囲を設定、編集権限を他の人に与えないといったことも可能。手元のPCとiPadを使って確かめた所、同期も相当早く、リアルタイムで同じページを複数人で編集することもできると思う。

  • テンプレートが豊富

これだけ機能が豊富だと、どこから手をつけていいかわからなくなる。そんな人のために公式・非公式でテンプレートが公開されている。

f:id:ai_gaminglife:20191128000648j:plain

テンプレートをそのまま使うもよし。自分の使いやすいように改造するもよし。どうあれ最初はテンプレートを入れてみて、それを参考にしてNotionの機能を知っていくのが良いと思う。

f:id:ai_gaminglife:20191128000704j:plain

▲ 因みにお気に入りのサブスクリプションの管理用テンプレート

mardown、Asciidocとの比較

  • 表現力

    Notion >>>>>>>>>> Asciidoc > markdown

    Notionの圧勝。ただのマークアップ言語とGUIツールの比較は一概にできないが。

  • 編集・入力の簡単さ

    markdown > Notion > Asciidoc

    markdownはある程度PCに慣れている人ならすぐに覚えられ、使えるというのが良いところ。Notionは現在メニュー画面などが日本語に対応しておらず、また、やれることが半端なく多いので、慣れるまでに時間がかかるのが難点。ただ、 / を入れれば大体の機能にアクセスできる。

  • 利用料

    markdown、Asciidoc 0円 Notion 5ドル / 月

気になる点

  • gitでバージョン管理ができない

    当然っちゃ当然だが、GUIツールなので、gitで差分をとってバージョン管理ができない。一応履歴で、誰が、どこを編集したか確認することができるが……

  • 万が一サービス終了したときのダメージが大きい

    All in oneのメモツールなので、もしサービス終了することがあれば、ダメージが大きすぎる。ただこれは外部サービスに頼る以上避けられないことか。

  • 頻繁なマウス操作が求められる

    大体の機能は / でアクセスできるし、ショートカットも充実しているが、それでもマウス操作が必要な場面が頻繁にある。プログラマは気にする人が多いかも

  • スマホアプリ版の完成度が低い

    iPad版はそこまででもないが、Android版の動作が本当に重すぎる。iPhone版は知りません。

  • タブ機能がない

    そういうデザイン思想で作ったのだろうと想像できるが、それでもタブ機能がほしい。色んな場所に散らばったページを同時に編集したい時がよくあるので。

おすすめの運用

  • 人に渡すメモ、高い表現力が必要ない、バージョン管理したい文書 ...... markdown
  • 仕様書などある程度の表現力が求められる文書 ..... asciidocで書いてPDF変換
  • スマホタブレットでもメモを取りたい・閲覧したい人 …… Google keepやevernote
  • それ以外 ...... Notion

ただしこれらは一人で運用する場合。研究室や会社等、集団で使う場合はまた違う判断基準になる。感覚的には、Notionは一つのワークスペースで30人くらいまでが編集権限を持つ、が限度だと思う。それ以上は相当厳格な運用ルールを定めないとグチャグチャになると思う。

まとめ

Notionはとことん触り心地の良さにこだわっているツールで、お陰でメモを取るのが苦痛ではなくなってしまった。自分だけのwikiが出来上がっていくのはとても楽しい。当面はこれで殆どのメモを取るつもりでいる。1年後、どれだけの情報が蓄積されることになるのだろうか……

スマホでも編集したい、という人を除けば、非常におすすめのツールなのでぜひ使ってみてもらいたい。

ところでイース9が期待通りに面白かったのでレビューを書く

半年ぶりくらいに発売日にゲームを買ったのですが、案の定めっちゃ面白かったので大学の課題の締め切りが近いにも関わらず1週間ほどでクリアしてしまった。クリアタイムはだいたい40時間くらい。トロコンはしてないです。

イースIX -Monstrum NOX - PS4

イースIX -Monstrum NOX - PS4

イースシリーズは前作イース8を不倒城さんのレビュー記事きっかけで3年遅れでswitch版を買ったくらいの新参者ですが、8の重厚なストーリーと動かして気持ちいい爽快なアクションの虜になってしまい、9は発売前から非常に注目していました.で,このPVが流れてきた時の衝撃。

youtu.be

イース8で唯一といっていいくらいの不満だったのが、敵が周りにいない時のフィールド移動の単調さ。基本的に走る以外の移動手段がないので、終盤だれてしまったのを記憶している(とは言えファストトラベル用のランドマークがこまめにあるのでそう気にならないレベルだったが)。

イース9はその問題に対し、「異能アクション」というアンサーを出してきた。壁登りで高い場所に移動し、サードアイでフィールド上の隠しアイテムを見つけ、滑空で目的地まで一気に飛び移る。8にはなかった縦の移動を加えることで、ただ街中を移動しているだけで楽しいというゲーム性の獲得に成功しています。PVで異能アクションを初めて見た時感動した。

これだけ聞くと、知ってる人は「大体ゼルダBotWじゃねえか!」とツッコミを受けそうですが、実際プレイした時に受ける印象は全くの別物。ゼルダがとにかく広大な世界を自由に駆け回り、能動的に新たなイベントを探索することが軸に据えられているに対し、イース9はあくまで戦闘がメイン。次の目的地はマップで指示され続けるので、誰がプレイしてもEDまでの全体通しての流れは同じになるでしょう。異能アクションはその目的地までの過程で「これはなかなか見つけられないだろう」といったショートカットルート、地図には表示されているのにどこにあるかわからない宝箱を見つける為にあります。

じゃあなんでこんなにも異能アクションが楽しいのかというと、ゲームの大半を過ごす<<監獄都市>>バルドゥークの、異能アクションで駆け回るために最適化されたレベルデザインが全てというほかありません。ストーリー進行で都度解放される異能アクションによって、最後まで決して広大とは言えない(狭いとはいっていない)一つの街を探索しているのに繰り返し新しい発見ができるように配置は、長年アクションRPGを作り続けてきた日本ファルコムさんの執念を感じます。そしてバルドゥークの街中を建物内など一部例外を除き、ロードなしの移動を実現した開発者。すごい。

8でも十分な量があった収集要素も更に充実。異能を駆使しなければ集めきることができない配置と数が探索をより楽しくさせています。

戦闘は、異能アクションという発明で、8以上にスピード感のある仕上がりとなっており、正当に進化させてきたなーという印象。まぁ戦闘に関しては前述の不倒城さんのイース8のレビューが全てです。ガチャ押しでスキルを押し付けるだけでも楽しく、中盤以降は敵の動きを見切り回避、防御し有利属性で敵を付いてブレイクを発生させ、大技をぶつけて一掃する……「仁王」で九州から出るのでやっとな腕前の筆者でも最後まで、楽しく遊ぶことができました。特に何も考えずボタンを押しているだけで楽しいアクションゲームはそうそうない。あと、これは個人的な評価点なのですが、プレイ中に気軽に難易度を変えられるのが非常にありがたい。いわゆるゲームオーバーに伴う戻し作業というのが苦手なので、稀にHARD->NORMALに変更してゲームオーバー回避ということをしていた。

ストーリーはコテコテのJRPGといった風合いで非常に私の好みに合致している。属性てんこ盛りの個性的なキャラクター達の人間ドラマと徐々に明かされていくバルドゥークの謎。舞台装置的な悪役もおらず、メインの登場人物皆人間臭い側面を持っている。しかしながらストーリーの完成度はイース8に軍配があがるかなあと。王道を往くせいで早い内に先が読めてしまったので。ただし、最終盤のあるワンシーンはイース8他、過去作ファンなら感動する。した。

欠点は、街中での戦闘でフレームレートが安定しない、岩肌などのテクスチャが現世代機ゲーム機後期に発売されたものとしてはやや荒い、あるクエストで即死トラップが至るところに仕掛けられていてダレたところなど。個人的にはこれくらいならまぁ愛嬌として許せる。ただしメインストーリー進行中に踏んだ進行不能バグ。テメーはダメだ(難易度変更することで解決した)。

過去作ファンなら楽しめる要素が随所に散りばめられているが(8しかプレイしてないお前がいうか?)、最初のイースシリーズとして十分オススメできる仕上がり。非常に完成度の高いアクションRPGだと断言できます。超おすすめ。

最近読んだ本・漫画を振り返る 2019年10月編

読書メモとして、最近読んだ技術書、一般書、漫画で面白かった本をブログに残していこうと思う。一応2~3ヶ月に一度は書くつもりでいる。

技術書

通信・ネットワーク周り

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

最早私が説明するまでもない、コンピュータ通信技術入門の大名著。ある論文の紹介をする際、何度も読み返し、その度にわかりやすい説明に感銘を受けた。

アプリケーション層しか触らないような人でも読むべき。というかコンピュータに関わる技術者はみんな読むべき。

改訂三版 802.11高速無線LAN教科書

改訂三版 802.11高速無線LAN教科書 (インプレス標準教科書シリーズ)

改訂三版 802.11高速無線LAN教科書 (インプレス標準教科書シリーズ)

研究の参考に教授に勧められた本。発売が2008年ということで802.11nまでの情報しか乗ってないが、802.11x系の無線通信フレームのフォーマットについて、くどいほど詳しく書いてある。TCP/IPを一定程度理解した人間が、Wifi周りの勉強をする時はまず最初に読んで、間違いないと思う。早く.11ac対応版出て。

Linuxネットワークプログラミング

Linuxネットワークプログラミング

Linuxネットワークプログラミング

Linuxネットワークプログラミングバイブル

Linuxネットワークプログラミングバイブル

Linuxネットワークプログラミングバイブル

IPv6に対応した貴重なネットワークプログラミングの入門本。これがなかったら研究室でコードなにも書けないニートになるところだった。

ゲームプログラミング・3DCG関連

コンピュータグラフィックス [改訂新版]

コンピュータグラフィックス [改訂新版]

コンピュータグラフィックス [改訂新版]

CG-ARTS検定の参考書.たかが一民間試験の参考書と侮るなかれ.CGの基本を,カラーの画像や数式を交えながら事細かく説明している.これ一冊で,最新のCG技術を実装できるようになるわけでは無いが,足がかりにはなる.CG特有の専門用語をざっくりと学ぶのにおすすめ.

Effective Modern C++

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

モダンなC++を書くのには必携の本.C++を学ぶならこの本から,という入門本の立ち位置ではないのに注意.

C++ポケットリファレンス

[改訂第3版]C++ポケットリファレンス (POCKET REFERENCE)

[改訂第3版]C++ポケットリファレンス (POCKET REFERENCE)

正直これは買わなくてもよい,cpprefjpやらcppreferenceなど,Web上には無料で閲覧できる日本語のC++ライブラリの解説ページが存在するからだ.私は電車の中など,スマホで調べてもいいが,スマホを使うとゲームで遊んでしまいそうな時などによく読んでいる.

一般書

岩田さん 岩田聡はこんなことを話していた。

岩田さん 岩田聡はこんなことを話していた。

岩田さん 岩田聡はこんなことを話していた。

任天堂岩田聡社長の,生前のインタビュー記事をまとめた一冊.課題解決によって人を幸せにすることを最上の幸せとして生きた氏の生き方が詰まっている.

(Linux) UDPを使って一定時間おきに文字列を送信するプログラム

研究室でUDPを使った無線通信の受信側が受信待ち状態にない時のパケットキャプチャをする必要があったので書いた.

劣化iperfにすぎないとか言ってはいけない

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

enum { DEST_PORT = 12345 };

void rand_text(int length, char* result) {
    int i, rnd_int;
    const char char_set[] = "01234567890abcdefghijklmnopqrstuvwkyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for (i = 0; i < length; i++) {
        result[i] = char_set[rand() % strlen(char_set)];
    }
    result[length] = 0;
}

// ./main 192.168.20.2 7360(1パケットあたりのUDPデータ長[Byte]) 1(何秒間隔で送るか) count(合計何回送るか)
int main(int argc, char* argv[]) {
    if (argc < 5) {
        printf("command line arguments is invalid!\n");
        return 1;
    }
    const char* dest_addr = argv[1];
    const int udp_data_len = atoi(argv[2]);
    const int interval_sec = atoi(argv[3]);
    const int count_max = atoi(argv[4]);

    printf("Send random data(%dByte) %dtimes to %s through UDP to every %d sec\n", udp_data_len, count_max, dest_addr, interval_sec);
    char* str;
    str = (char*)malloc(sizeof(char) * udp_data_len);
    srand(time(NULL));
    rand_text(udp_data_len, str);
    printf("create string strlen(%ld)\n", strlen(str));

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(DEST_PORT);
    addr.sin_addr.s_addr = inet_addr(dest_addr);

    int count = 0;
    while (count < count_max) {
        printf("send %ldByte\n", strlen(str));
        sendto(sock, str, strlen(str), 0, (struct sockaddr*)&addr, sizeof(addr));
        printf("----------\n");
        sleep(interval_sec);
        count++;
    }
    free(str);
    return 0;
}

30分程度で書いた使い捨てのプログラム故,エラー処理が一切書いてないのに注意.

std::bindではデフォルト引数を省略できない

std::bindを使っていたらある問題に遭遇した。

void func(int a){
    std::cout << a * 10 << std::endl;
}
int main(){
    using namespace std::placeholders;
    auto fuction = std::bind(func, _1);
    function(2);
}

std::bindを使ってライブラリで用意されている関数を束縛し別のところで呼び出す、といったことをしたかったのだが、これが何故かコンパイルが通らなかった。(実際は、クラスのメンバ関数をbindした。簡単のためそのコードはここに示す

なぜだろうか……といろいろ調べて回ったところ、とても単純な話だった。

void func(int a, int b = 10){
    std::cout << a * b << std::endl;
}
int main(){
    using namespace std::placeholders;
    auto fuction = std::bind(func, _1);
    function(2);
}

引数1つで呼び出すものと思っていたfunc()関数が、実際は第2引数にintを取る関数で、それにデフォルト引数が設定されていた。じゃあどうやってこの関数を束縛すればいいかというと、bind時、デフォルト引数も明示的に渡せばよい。

// Error!
// auto function = std::bind(func, _1);

// OK!
auto function = std::bind(func, _1, 10);

// call
function(2);

wandbox.org

bindは使うべきではないという話

ここまでbindを使って関数を束縛してきたが、調べてみると、bindはパフォーマンス上に問題があるらしい。

じゃあ代わりに何を使うのかっていうと、みんな大好きラムダ式である。

// Error!
// auto function = std::bind(func, _1);

// OK! (low performance)
auto function = std::bind(func, _1, 10)

// OK! (high performance)
auto function = [=](int _1){ func(_1); };

// call
function(2);

Compiler Explorerbindラムダ式を比較してみると一目瞭然でパフォーマンスにかなり影響することがわかる。

まとめ

bindなんか使わずラムダを使おう。