我经常使用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
,则不会出现这种情况。)
我的问题是:
答案 0 :(得分:18)
从技术上讲:
实际上说:
我不建议仅为单个函数的参数创建新类型(除非它是特定于此函数的枚举),类型应该渗透到应用程序中以避免反复使用强制转换。
如果在整个应用程序中使用了X
,Y
,Width
和Height
类型,那么不仅没有演员表,而且您的应用程序也会很多更安全,也更好地记录(是的......我是一个类型怪胎)。
现在,关于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文档)。