使用strong typedef作为Boost参数库的一个更轻量级的替代品?

时间:2012-02-09 12:55:05

标签: c++ boost boost-parameter

我经常使用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吗? (文档为very brief。)
  • 是否有重要理由选择升压参数库?

2 个答案:

答案 0 :(得分:18)

从技术上讲:

  • 工作
  • 它增加了类型安全性

实际上说:

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

如果在整个应用程序中使用了XYWidthHeight类型,那么不仅没有演员表,而且您的应用程序也会很多更安全,也更好地记录(是的......我是一个类型怪胎)。

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

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

答案 1 :(得分: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文档)。

相关问题