类似go语言里的defer实现,有几个注意点:
- 使用析构函数实现,后面的defer会优先调用;
- defer是引用传递,defer内修改值,也会影响外面。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <functional>
using namespace std;
class DeferHelper
{
public:
DeferHelper(std::function<void()> &&func) : m_func(std::move(func)) {}
~DeferHelper() { if (m_func) m_func(); }
private:
std::function<void()> m_func;
};
#define CONNECTION(text1,text2) text1##text2
#define CONNECT(text1,text2) CONNECTION(text1,text2)
#define defer(code) DeferHelper CONNECT(L,__LINE__) ([&](){code;})
int main()
{
int aa = 1;
int bb = 2;
int* a = &aa;
int* b = &bb;
defer( std::cout << "defer1" << std::endl;
std::cout << *a << "," << *b << endl;
);
*b = 4;
defer( std::cout << "defer2" << std::endl;
std::cout << *a << "," << *b << endl;
*a = 3;
);
std::cout << "123456" << std::endl;
return 0;
}
// 输出
123456
defer2
1,4
defer1
3,4
defer fifo的实现,使用list作为辅助变量,不使用栈变量:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <functional>
#include <list>
class DeferHelperFifo
{
public:
DeferHelperFifo() {}
~DeferHelperFifo() {
for (auto &func : m_funcs) {
func();
}
m_funcs.clear();
}
void add_func(std::function<void()> &&func) { m_funcs.push_back(std::move(func)); }
private:
std::list<std::function<void()>> m_funcs;
};
#define use_defer_fifo() DeferHelperFifo DEFER_FIFO;
#define defer_fifo(func) DEFER_FIFO.add_func ([&](){func;});
int main()
{
use_defer_fifo();
defer_fifo(
fprintf(stdout, "defer_test 2\n");
);
defer_fifo(
fprintf(stdout, "defer_test 3\n");
);
fprintf(stdout, "defer_test 1\n");
defer_fifo(
fprintf(stdout, "defer_test 4\n");
);
return 0;
}
// 输出
defer_test 1
defer_test 2
defer_test 3
defer_test 4