用于创建新作用域的最佳C++宏
Best C++ macro for creating a new scope
我有一个宏
#define SCOPE_GUARD(GUARD, NAME, ...)
for(bool __once = true; __once; /* nothing */)
for(GUARD NAME (__VA_ARGS__); __once; __once = false)
使用类似的东西:
SCOPE_GUARD(std::unique_lock, lock, (some_mutex))
do_some();
或
SCOPE_GUARD(std::unique_ptr<char>, buff, (new char[BUFFER_SIZE])) {
*buff.get() = 0;
GetSomeDescription(buff.get(), BUFFER_SIZE);
Log(buff.get);
}
宏是否有类似的(更好的)实现,它是由多个编译器正确优化的。
p.S.宏应该是一个,没有像BOOST_SCOPE_EXIT_END
这样的最终宏(可以由if (...)
重新定义)。
编辑使用代码样式的简单scoupe是非常巨大的。
{
std::unique_lock lock (some_mutex);
do_some();
}
但我想用一些像这个
SCOPE_GUARD(std::unique_lock, lock, (some_mutex)) do_some();
使用C++模板和lambda表达式可以做很多工作。使用它们可能是值得探索的。例如,不使用SCOPE_GUARD
宏,您可以执行以下操作:
template <typename G, typename F, typename... A>
inline auto scope_guard(G&&, F&& f, A&&... args)
-> decltype(std::forward<F>(f)(std::forward<A>(args)...))
{
return std::forward<F>(f)(std::forward<A>(args)...);
}
scope_guard(std::unique_lock<std::mutex>(m), do_something);
scope_guard(std::unique_lock<std::mutex>(m), [&]() {
do_something1();
do_something2();
do_something3();
});
如果我使用的是直接的宏,我的宏可能看起来像这样:
#define UNWRAP(...) __VA_ARGS__
#define SCOPE_GUARD(X, Y) do { X; UNWRAP Y; } while (0)
SCOPE_GUARD(std::unique_lock<std::mutex> lock(m), (do_something()));
SCOPE_GUARD(std::unique_lock<std::mutex> lock(m), (
do_something1();
do_something2();
do_something3();
));
我想这就是您想要的:
#define PROTECTED_BY(m) for(std::unique_lock<decltype(m)> _lock_(m) ; _lock_ ; _lock_.unlock())
完整用例:
#include <iostream>
#include <mutex>
#define PROTECTED_BY(m) for(std::unique_lock<decltype(m)> _lock_(m) ; _lock_ ; _lock_.unlock())
using namespace std;
int main()
{
mutex m;
PROTECTED_BY(m)
{
cout << "Hello World" << endl;
}
return 0;
}
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在AVX通道中混洗的最佳方式
- 程序顶部的声明与定义(最佳实践)
- 别名模板的专业化 C++11 中没有开销的最佳替代方案