用于创建新作用域的最佳 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
这样的finally宏(可以通过if (...)
重新定义).
编辑
使用codestyle的简单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;
}
我有一个宏
#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
这样的finally宏(可以通过if (...)
重新定义).
编辑 使用codestyle的简单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;
}