我的意思是:
int main()
{
void a()
{
// code
}
a();
return 0;
}
我的意思是:
int main()
{
void a()
{
// code
}
a();
return 0;
}
当前回答
局部类已经提到过,但是这里有一种方法可以让它们更像局部函数,使用operator()重载和匿名类:
int main() {
struct {
unsigned int operator() (unsigned int val) const {
return val<=1 ? 1 : val*(*this)(val-1);
}
} fac;
std::cout << fac(5) << '\n';
}
我不建议使用这个,这只是一个有趣的技巧(可以做,但我不应该)。
2014年更新:
随着c++ 11的兴起,你现在可以有一些局部函数,其语法有点像JavaScript:
auto fac = [] (unsigned int val) {
return val*42;
};
对于递归函数,不支持编译时类型演绎:
function<int(int)> factorial{ [&](int n)
{
return (n == 1 || n == 0) ? 1 : factorial(n - 1) * n;
} };
其他回答
所有这些技巧只是看起来(或多或少)像局部函数,但它们并不是这样工作的。在局部函数中,你可以使用超函数的局部变量。这是一种半全球化。这些把戏都做不到。最接近的是c++0x中的lambda技巧,但它的闭包是在定义时间内绑定的,而不是使用时间。
在c++中,你不能在另一个自由函数中定义一个自由函数。
出于各种目的,c++通过lambdas:1来支持这一点
int main() {
auto f = []() { return 42; };
std::cout << "f() = " << f() << std::endl;
}
这里,f是一个lambda对象,充当main中的局部函数。可以指定捕获以允许函数访问本地对象。
在幕后,f是一个函数对象(即提供操作符()的类型的对象)。函数对象类型由编译器基于lambda创建。
从c++ 11开始
No.
你想做什么?
处理:
int main(void)
{
struct foo
{
void operator()() { int a = 1; }
};
foo b;
b(); // call the operator()
}
从c++ 11开始,你可以使用合适的lambdas。更多细节请参见其他答案。
老答案:你可以,在某种程度上,但你必须欺骗和使用一个虚拟类:
void moo()
{
class dummy
{
public:
static void a() { printf("I'm in a!\n"); }
};
dummy::a();
dummy::a();
}