0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JavaScript/TypeScriptの即時関数と同じことをC++のラムダ式で実現する

Last updated at Posted at 2022-01-30

概要

JavaScript/TypeScriptでは,変数のスコープの可能な限り小さくしてスコープ汚染を防ぐために,以下のような即時関数(関数を定義すると同時に実行する)がよく用いられます.

const s: string = (() => {
  let ss = ""
  // 一時的な変数ssを使った処理
  return ss
})() // ()をつけてアロー関数を即実行する

// 以降,スコープ外の一時的な変数にはアクセスできない.また,文字列sはconstなので誤って変更される恐れはない.

C++(C++11以降)でもラムダ式を用いることで同じこと(関数を定義すると同時に実行する)ができます.具体的には,ラムダ式の処理内容を記述する{}の直後にラムダ式を実行する()を挿入することである.こうすることで宣言したラムダ式をその場で実行することができます.

注意点として,JavaScript/TypeScriptと異なりC++では変数が自動キャプチャされません.C++ではラムダ式の[]においてラムダ式内で使用する変数を明示的にキャプチャする必要があります.

ソースコード

#include <iostream>
#include <sstream>
#include <string>

int main() {
  const std::string& s0 = [/* キャプチャする変数 */]() {
    std::stringstream ss;
    ss << "Lambda expression";  // 一時的な変数を用いた処理
    ss << " ("
       << "Immediately Invoked Function Expression"
       << ")";
    return ss.str();
  }();  // ()をつけてラムダ式を即時実行する
  std::cout << s0 << std::endl;
  // 以降,ラムダ式内で宣言された一時的な変数にはアクセスできない.また,文字列s0はconstなので誤って変更される恐れはない

  return 0;
}

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?