用于创建新作用域的最佳C++宏

Best C++ macro for creating a new scope

本文关键字:最佳 C++ 作用域 创建 用于      更新时间:2023-10-16

我有一个宏

#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;
}