为什么要调用dtor(使用匿名/ lambda函数)
|
我试图模仿一种最终的效果。所以我认为我应该进行快速的肮脏测试。
这个想法是使用“最重要的” const来停止破坏,并将“ finally”块放入lambda中。但是显然我做错了什么,它在MyFinally()的末尾被调用。我该如何解决这个问题?
#include <cassert>
template<typename T>
class D{
T fn;
public:
D(T v):fn(v){}
~D(){fn();}
};
template<typename T>
const D<T>& MyFinally(T t) { return D<T>(t); }
int d;
class A{
int a;
public:
void start(){
int a=1;
auto v = MyFinally([&]{a=2;});
try{
assert(a==1);
//do stuff
}
catch(int){
//do stuff
}
}
};
int main() {
A a;
a.start();
}
我的解决方案代码(注意:最终不能在同一块中包含两个。正如您所料。但是仍然有点脏)
#include <cassert>
template<typename T>
class D{
T fn; bool exec;
public:
D(T v):fn(v),exec(true){}
//D(D const&)=delete //VS doesnt support this yet and i didnt feel like writing virtual=0
D(D &&d):fn(move(d.fn)), exec(d.exec) {
d.exec = false;
}
~D(){if(exec) fn();}
};
template<typename T>
D<T> MyFinally(T t) { return D<T>(t); }
#define FINALLY(v) auto OnlyOneFinallyPlz = MyFinally(v)
int d;
class A{
public:
int a;
void start(){
a=1;
//auto v = MyFinally([&]{a=2;});
FINALLY([&]{a=2;});
try{
assert(a==1);
//do stuff
}
catch(int){
FINALLY([&]{a=3;}); //ok, inside another scope
try{
assert(a==1);
//do other stuff
}
catch(int){
//do other stuff
}
}
}
};
void main() {
A a;
a.start();
assert(a.a==2);
}
有趣的是,如果您在原始代码中删除了MyFinally中的&,它将起作用-_-。
没有找到相关结果
已邀请:
5 个回复
琶竞捆栓
您可以通过引入move构造函数来修复它
然后您可以重写玩具
希望能帮助到你。使用
时,不需要\“ const reference \\”技巧。请参阅此处,了解如何在C ++ 03中使用const引用进行操作。
缉康怪
结乳
。
然后,您可以简单地使用它:
夏瓤跋棘
然后将其写在呼叫站点:
这变得完全像Herb Sutter的代码一样。 演示:http://www.ideone.com/uSkhP 现在,析构函数在退出
函数之前被调用。 另一种不再使用auto关键字的实现:
并将其用作:
看起来有趣吗? 完整的演示:http://www.ideone.com/DYqrh
你换