C 11 范围出口警卫,好主意吗?

新手上路,请多包涵

我为 C++11 编写了一个小型实用程序类,我将其用作范围保护,以便更轻松地处理异常安全和类似的事情。

看起来有点像黑客。但我很惊讶我没有在其他地方看到它使用 C++11 功能。我认为 boost 对于 C++98 有类似的东西。

但这是个好主意吗?还是有我遗漏的潜在问题?在 boost 或类似中是否已经有类似的解决方案(具有 C++11 功能)?

     namespace detail
    {
        template<typename T>
        class scope_exit : boost::noncopyable
        {
        public:
            explicit scope_exit(T&& exitScope) : exitScope_(std::forward<T>(exitScope)){}
            ~scope_exit(){try{exitScope_();}catch(...){}}
        private:
            T exitScope_;
        };

        template <typename T>
        scope_exit<T> create_scope_exit(T&& exitScope)
        {
            return scope_exit<T>(std::forward<T>(exitScope));
        }
    }

#define _UTILITY_EXIT_SCOPE_LINENAME_CAT(name, line) name##line
#define _UTILITY_EXIT_SCOPE_LINENAME(name, line) _UTILITY_EXIT_SCOPE_LINENAME_CAT(name, line)
#define UTILITY_SCOPE_EXIT(f) const auto& _UTILITY_EXIT_SCOPE_LINENAME(EXIT, __LINE__) = ::detail::create_scope_exit(f)

它使用了类似的东西。

 int main ()
{
  ofstream myfile;
  myfile.open ("example.txt");
  UTILITY_SCOPE_EXIT([&]{myfile.close();}); // Make sure to close file even in case of exception
  myfile << "Writing this to a file.\n"; // Imagine this could throw
  return 0;
}

原文由 ronag 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 454
1 个回答

但这是个好主意吗?

当然。一个相关的主题是 RAII 范式

还是有我遗漏的潜在问题?

你不处理异常。

在 boost 或类似中是否已经有类似的解决方案(具有 C++0x 功能)?

Alexandrescu 很久以前就提出了 ScopeGuard 。 Boost 和 std::tr1 都有一个叫做 scoped_ptrshared_ptr (使用自定义删除器)的东西,可以让你完成这个。

原文由 dirkgently 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题