16

我经常使用 Boost strong 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。)

我的问题是:

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

2 回答 2

20

从技术上讲:

  • 有用
  • 它增加了类型安全

实际来说:

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

如果在整个应用程序中都使用了 types X、和Y,那么不仅不会有强制转换,而且您的应用程序也会更安全,并且记录得更好(是的......我是一个类型怪胎)。WidthHeight

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

当您已经有类型时,可以(可能)添加 Boost.Parameters。老实说,虽然我从来没有看到需要。当您的函数变得如此笨拙以至于需要 Boost.Parameters 来调用它们时,您应该修复这些函数,而不是增加混乱。

于 2012-02-09T13:39:56.553 回答
2

使用 BOOST_STRONG_TYPDEF 正在创建一个新类型,其中 boost 参数库用于为参数命名。它使您可以更明确地了解您的功能。例如(来自 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
  }
}

让您几乎以合同设计的方式明确说出预期的内容。但是,我发现这会使代码的可读性复杂化,以至于不值得这样做。

我个人更喜欢使用 BOOST_STRONG_TYPEDEF 因为它创建了一个新类型“可用于匹配函数或模板参数”(再次来自 boost 文档)。

于 2012-02-09T13:09:56.577 回答