1. ホーム
  2. c++

[解決済み】C++で関数の中に関数を持つことは可能か?

2022-03-28 02:49:02

質問

というような意味です。

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

  return 0;
}

解決方法は?

モダン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!"); 
    }
}

ラムダは **capture-by-reference* によってもローカル変数を変更することができます。capture-by-referenceでは、ラムダはそのラムダのスコープで宣言されたすべてのローカル変数にアクセスすることができます。この場合、ラムダはそのスコープで宣言されたすべてのローカル変数にアクセスすることができ、それらの変数を普通に修正・変更することができます。

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++はローカル関数をサポートしていないので、ローカル関数がないことに慣れているのです。しかし、そのようなごまかしには慣れていない。私はこのコードにかなりの時間をかけて、それが本当にローカル関数を許可するためだけに存在するのかどうかを確認するつもりだ。よくないですね。