C++ では関数内に関数を入れることはできますか? 質問する

C++ では関数内に関数を入れることはできますか? 質問する

つまり、次のようなことです:

int main() 
{
  void a() 
  {
      // code
  }
  a();

  return 0;
}

ベストアンサー1

最新の C++ - ラムダを使用すれば可能です!

現在のバージョンの C++ (C++11、C++14、C++17) では、ラムダの形式で関数内に関数を含めることができます。

int main() {
    // This declares a lambda, which can be called just like a function
    auto print_message = [](std::string message) 
    { 
        std::cout << message << "\n"; 
    };

    // Prints "Hello!" 10 times
    for(int i = 0; i < 10; i++) {
        print_message("Hello!"); 
    }
}

ラムダは、**参照によるキャプチャ* を通じてローカル変数を変更することもできます。参照によるキャプチャを使用すると、ラムダはラムダのスコープ内で宣言されたすべてのローカル変数にアクセスできます。通常どおり、それらを変更および修正できます。

int main() {
    int i = 0;
    // Captures i by reference; increments it by one
    auto addOne = [&] () {
        i++; 
    };

    while(i < 10) {
        addOne(); //Add 1 to i
        std::cout << i << "\n";
    }
}

C++98 および C++03 - 直接ではありませんが、ローカルクラス内の静的関数では可能です。

C++ はこれを直接サポートしていません。

とはいえ、ローカル クラスを作成して、関数 (staticまたは以外static) を持たせることができるので、多少不便ではありますが、ある程度はこれを実現できます。

int main() // it's int, dammit!
{
  struct X { // struct's as good as class
    static void a()
    {
    }
  };

  X::a();

  return 0;
}

しかし、私はその実践に疑問を抱きます。誰もが (まあ、少なくとも今は知っていますが:)) C++ はローカル関数をサポートしていないので、ローカル関数がないことに慣れています。しかし、その場しのぎの対応には慣れていません。このコードにかなりの時間を費やして、本当にローカル関数を許可するためだけに存在していることを確認するつもりです。良くありません。

おすすめ記事