使用强typedef作为Boost参数库的更轻量级的替代方案

Using strong typedef as a more lightweight alternative to Boost Parameter library?

本文关键字:轻量级 方案 参数 typedef 作为 Boost      更新时间:2023-10-16

我经常使用Boost强typedef实用程序来提高程序的安全性。例如,通过编写这样的代码:

BOOST_STRONG_TYPEDEF(int, X)
BOOST_STRONG_TYPEDEF(int, Y)
BOOST_STRONG_TYPEDEF(int, Width)
BOOST_STRONG_TYPEDEF(int, Height)
struct Rect {
    Rect(X x, Y y, Width w, Height h);
};
// Usage:
Rect rect(X(10), Y(20), Width(800), Height(600));

这里的强typedef提高了代码的可读性和安全性。(如果参数按错误的顺序提供,编译器将报告错误,而如果参数都是int,则不会出现这种情况。)

我的问题是:

  • 是否可以为此目的使用BOOstrongTRONG_TYPEDEF?(文档非常简短。)
  • 是否有重要的理由更喜欢boost参数库

从技术上讲:

  • 它有效
  • 它增加了类型安全性

实际上:

我不建议仅仅为了单个函数的参数而创建新类型(除非它是该函数特有的枚举),类型应该渗透到应用程序中,以避免反复使用强制转换。

如果在整个应用程序中使用类型XYWidthHeight,那么不仅不会进行强制转换,而且您的应用程序也会更安全,文档也会更好(是的……我是个类型怪胎)。

现在,关于Boost.Parameters,这是完全不同的。

Boost.当类型已经就位时,可以(潜在地)添加参数。老实说,尽管我从来没有觉得有必要。当你的函数变得如此笨拙以至于需要Boost.Parameters来调用它们时,你应该修复这些函数,而不是增加混乱。

使用BOOstrongTRONG_TYPDEF正在创建一个新类型,其中作为BOOST参数库用于为参数命名。它可以让您更明确地了解您的功能。例如(来自助推文档)

#include <boost/parameter/preprocessor.hpp>
namespace graphs
{
  BOOST_PARAMETER_FUNCTION(
      (void),                // 1. parenthesized return type
      depth_first_search,    // 2. name of the function template
      tag,                   // 3. namespace of tag types
      (required (graph, *) ) // 4. one required parameter, and
      (optional              //    four optional parameters, with defaults
        (visitor,           *, boost::dfs_visitor<>())
        (root_vertex,       *, *vertices(graph).first)
        (index_map,         *, get(boost::vertex_index,graph))
        (in_out(color_map), *,
          default_color_map(num_vertices(graph), index_map) )
      )
  )
  {
      // ... body of function goes here...
      // use graph, visitor, index_map, and color_map
  }
}

让你明确地说出预期,几乎是以合同设计的方式。然而,我发现这会使代码的可读性变得非常复杂,以至于不值得这样做。

就我个人而言,我更喜欢使用BOOstrongTRONG_TYPEDEF,因为它创建了一个新的类型"可以用于匹配函数或模板参数"(同样来自BOOST文档)。