Имитация вложенных функций в C ++ - PullRequest
27 голосов
/ 18 марта 2011

В C следующий код работает в gcc.

int foo( int foo_var )
{
 /*code*/
  int bar( int bar_var )  
  {
    /*code*/
    return bar_var;
  }
  return bar(foo_var);
}

Как мне добиться той же функциональности вложенных функций в C ++ с помощью компилятора gcc? Не против, если это похоже на вопрос новичка. Я новичок в этом сайте.

Ответы [ 8 ]

36 голосов
/ 18 марта 2011

Локальные функции не разрешены в C ++, но локальные классы и функции разрешены в локальных классах.Итак:

int foo( int foo_var )
{
 /*code*/
  struct local 
  {
    static int bar( int bar_var )  
    {
      /*code*/
      return bar_var;
    }
  };
  return local::bar(foo_var);
}

В C ++ 0x вы также можете создать функтор с использованием лямбда-синтаксиса.Это немного сложнее в C ++ 03, но все же неплохо, если вам не нужно захватывать переменные:

int foo( int foo_var )
{
 /*code*/
  struct bar_functor
  {
    int operator()( int bar_var )  
    {
      /*code*/
      return bar_var;
    }
  } bar;
  return bar(foo_var);
}
11 голосов
/ 18 марта 2011

Превратите свою функцию в функтор, как Херб Саттер предлагает в этой статье

10 голосов
/ 05 июля 2013

использовать локальный функтор

#define lambda(return_type, function_body) \
struct { return_type operator () function_body }


int main ()
{
    lambda(int, (int x, int y) { return x > y ? x : y; } ) maxFunc;
    int m = maxFunc(1,2); //=> 2
    ...
}
9 голосов
/ 27 мая 2013

Конструкция, наиболее близкая к вложенным функциям, - это лямбда-код C ++ 11.

void SomeFunction(int x)
{
    int var = 2;
    auto lambda = [&] (int param) -> int { return var + param; };

    printf("var + x = %d\n", lambda(x));
}

Ламды позволяют использовать переменные из внешней области видимости ([&] указывает на автоматический захват всех переменных извнешний объем по ссылке).Лямбда, которая не использует никаких переменных из внешней области видимости (use []), может быть преобразована в указатель функции того же типа и, таким образом, может быть передана в функции, принимающие указатель функции.

3 голосов
/ 18 марта 2011

Вы можете попробовать использовать boost :: phoenix (v2 является подпакетом Spirit, v3 находится в svn / trunk как его собственный пакет и должен быть в 1.47)

#include <boost/spirit/include/phoenix.hpp>
#include <boost/function.hpp>

using namespace boost::phoenix::arg_names;

int foo( int foo_var )
{
 /*code*/
  boost::function<int(int)> bar = _1 + 5;
  return bar(foo_var);
}

int main() {
return foo(1);
}
1 голос
/ 18 марта 2011

В C ++ вы можете добиться того же эффекта другими возможными способами.Прямых вложенных функций нет.Две полезные ссылки:

http://www.respower.com/~earlye/programming/19990916.001.htm

http://www.devx.com/tips/Tip/40841

0 голосов
/ 23 марта 2019

Я знаю, что эта тема старая. Но решением C ++ 11 было бы написать лямбда-выражения и вызывать их всякий раз, когда нужно

0 голосов
/ 18 марта 2011

AFAIK, вложенные функции не разрешены в C ++.

...