设为首页 加入收藏

TOP

19.4 模仿强制
2013-10-07 15:07:27 来源: 作者: 【 】 浏览:70
Tags:19.4 模仿 强制

19.4  模仿强制

利用C++(www.cppentry.com)对成员函数形式的转换操作符的支持[Stro1997],我们可以写出行为像强制那样的类。此外,强制也可能涉及到语义上截然不同的类型。正如被广泛指出的那样[Meye1996, Meye1998, Dewh2003],对这种操作符的使用可能会导致许多问题,并且许多场合下它们都被误用了。但语言仍然选择支持它们,因为它们在某些场合下是非常有用的,例如把它们使用在强制类上面就是既合适又必需的。考虑如下的类,它将一个C风格的字符串转换为一个整型:

程序清单19.3

  1. class str2int  
  2. {  
  3. // 构造  
  4. public:  
  5.   explicit str2int(char const *s)  
  6.     : m_value(atoi(s))  
  7.   {}  
  8. // 操作符  
  9. public:  
  10.   operator int() const  
  11.   {  
  12.     return m_value;  
  13.   }  
  14. // 成员  
  15. private:  
  16.   int m_value;  
  17. };  

现在,给出一个字符串,我们就可以通过如下形式将它"转型"为一个整型:
  1. int val = str2int("34"); 

或者
  1. int val = (str2int)"34"; 

或者甚至
  1. int val = static_cast<str2int>("34"); 

尽管在本例中我们可以直接调用atoi()来达到目的,但上面的代码看起来确实有点酷,不是吗?借助于C++(www.cppentry.com)对模板的支持,该技术可以被泛化至相当可观的程度,从而带来令人愉快和惊讶的效果。

现在,考虑我们想要对这里的数值解析做一点扩展,并把它泛化到可以解析出所有整型(包括bool)的程度。显然,我们需要利用一点模板。有一点或许会令你感到惊讶,那就是最终的解决方案其实非常简单。(注意,之所以使用long long类型,仅仅是为了兼容于Metrowerks CodeWarrior。简单起见,我没有兼顾无符号类型或除char之外的字符编码。当然了,一个现实中的实现应该使用恰当的抽象,即int64_t,来提供一个更具可移植性的解决方案。)

程序清单19.4

  1. template <typename I> 
  2. class str2int  
  3. {  
  4. // 构造  
  5. public:  
  6.   explicit str2int(char const *s);  
  7. // 操作符  
  8. public:  
  9.   operator I() const  
  10.   {  
  11.     return m_value;  
  12.   }  
  13. // 成员  
  14. private:  
  15.   I m_value;  
  16. };  
  17.  
  18. template <typename I> 
  19. inline str2int<I>::str2int(char const *s)  
  20.   : m_value(static_cast<I>(atoi(s)))  
  21. {}  
  22. template <> 
  23. inline str2int<long long>::str2int(char const *s)  
  24.   : m_value(strtoll(s, NULL, 10))  
  25. {}  
  26. template <> 
  27. inline str2int<bool>::str2int(char const *s)  
  28.   : m_value(0 == (strcmp(s, "true"))  
  29. {}  

这个实现的一个令人愉快的副作用是它模拟了内建强制的形式。

  1. short     s  = str2int<short>("34");  
  2. int       i  = str2int<int>("65536");  
  3. bool      b  = str2int<bool>("true");  
  4. long long ll = str2int<long long>("-9223372036854775808");  

我们已经看到如何打扮成C++(www.cppentry.com)内建的强制操作符的样子。这固然很好,但还有其他实质性的地方吗?呃……我确信我们的方案对bool以及它的非数值形式的字符串表示(它可以被轻易地扩展以支持"1"和"TRUE"这样的字符串)引起了你的注意,但你可能想看到一些解决实质性问题的东西。毕竟,str2int类模板也可以仅仅被实现为一组相关的函数,如str2short、str2bool,等等。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇3.3 scoped_array 下一篇19.2 C++中的强制

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: