使用强typedef作为Boost参数库的更轻量级的替代方案
Using strong typedef as a more lightweight alternative to Boost Parameter library?
我经常使用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参数库
从技术上讲:
- 它有效
- 它增加了类型安全性
实际上:
我不建议仅仅为了单个函数的参数而创建新类型(除非它是该函数特有的枚举),类型应该渗透到应用程序中,以避免反复使用强制转换。
如果在整个应用程序中使用类型X
、Y
、Width
和Height
,那么不仅不会进行强制转换,而且您的应用程序也会更安全,文档也会更好(是的……我是个类型怪胎)。
现在,关于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文档)。
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- C++11 中不同类型的对象的 std::array 的替代方案
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 用于C++的Win32 CRITICAL_SECTION的轻量级跨平台替代方案
- 对于C++中的日期/时间库,是否有一种轻量级的Boost替代方案
- 使用强typedef作为Boost参数库的更轻量级的替代方案