这样的闭包实现是否有任何问题(从python hack中被盗)?
void function(int value) {
struct closure {
closure(int v = value) : value_(value) {}
private: int value_;
};
closure c;
}
经过进一步调查,它出现在成员函数中,局部变量不能用作默认值,但是对象变量可以。
答案 0 :(得分:6)
这看起来是关闭的良好基础。更多的是成语而不是黑客,因为你合法地将语言功能用于其预期目的。
当然,你的例子没有做任何事情。它只能在function
内使用。
Gratuitous C ++ 0x plug:
#include <functional>
void some_function( int x ) { }
void function( int value ) {
struct closure {
std::function< void() > operator()( int value )
{ return [=](){ some_function( value ); }; }
};
auto a = closure()( value );
auto b = closure()( 5 );
a();
b();
b();
}
答案 1 :(得分:6)
闭包的C ++等价物:
class Closure
{
public:
Closure(std::string const& g)
:greet(g)
{}
void operator()(std::string const& g2)
{
std::cout << greet << " " << g2;
}
private:
std::string greet;
};
int main()
{
Closure c("Hello");
c("World"); // C acts like a function with state. Whooo.
}
使用C ++ 11中的新lambda语法,它变得更加容易。
int main()
{
std::string g("Hello");
auto c = [g](std::string const& m) {std::cout << g << " " << m;};
c("World");
}
使用C ++ 14中的新扩展lambda语法(gcc上的-std = c ++ 1y),它变得更加容易。
int main()
{
auto c = [g="Hello"](std::string const& m) {std::cout << g << " " << m;};
c("World");
}