Ответ 1
Превратите свою функцию в функтор как Herb Sutter предлагает в этой статье
В C следующий код работает, я всегда использую gcc.
int foo( int foo_var )
{
/*code*/
int bar( int bar_var )
{
/*code*/
return bar_var;
}
return bar(foo_var);
}
Как добиться одинаковой функциональности вложенных функций в С++ в gcc-компиляторе? Не возражайте, если это похоже на вопрос начинающего. Я новичок на этом сайте.
Превратите свою функцию в функтор как Herb Sutter предлагает в этой статье
Локальные функции не допускаются в С++, но локальные классы и функции разрешены в локальных классах. Итак:
int foo( int foo_var )
{
/*code*/
struct local
{
static int bar( int bar_var )
{
/*code*/
return bar_var;
}
};
return local::bar(foo_var);
}
В С++ 0x у вас также будет возможность создать функтор с использованием синтаксиса лямбда. Это немного сложнее в С++ 03, но все равно неплохо, если вам не нужно захватывать переменные:
int foo( int foo_var )
{
/*code*/
struct bar_functor
{
int operator()( int bar_var )
{
/*code*/
return bar_var;
}
} bar;
return bar(foo_var);
}
используйте локальный функтор
#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
...
}
Конструкция, которая ближе всего к вложенным функциям, представляет собой С++ 11 lambda.
void SomeFunction(int x)
{
int var = 2;
auto lambda = [&] (int param) -> int { return var + param; };
printf("var + x = %d\n", lambda(x));
}
Lamdas позволяет использовать переменные из внешней области ([&] указывает, чтобы автоматически захватывать все переменные из внешней области по ссылке). Лямбда, которая не использует какие-либо переменные из внешней области (use []), может быть преобразована в указатель функции того же типа и поэтому может быть передана функциям, принимающим указатель на функцию.
Вы можете попробовать использовать boost:: phoenix (v2 - подпакет с духом, 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);
}
В С++ вы можете добиться того же эффекта другими способами. Прямых вложенных функциональных реализаций нет. Две полезные ссылки:
http://www.respower.com/~earlye/programming/19990916.001.htm
AFAIK, вложенные функции в С++ не допускаются.