2013-05-07 51 views
1
  1. 的是什么叫“透明类包装”,在C++
  2. 它为什么叫“透明......”
  3. 什么是它的使用(什么不能做没有“透明类包装”)。

欣赏一些概念性解释。什么用C++透明类包装

回答

0

最有可能的是,你指的是一个轻量级的内联(头文件)包装类,虽然我不熟悉这个术语。像这样添加抽象级别在允许通用客户端代码方面很有用。

+0

这个词我是从 '谷歌C++风格指南' 了。它说:“我们要求所有单个参数构造函数都是显式的,而打算成为其他类的透明包装的类是例外。”仅供参考http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Explicit_Constructors#Explicit_Constructors。所以我好奇什么是“透明类包装” – 2013-05-07 03:58:23

4

透明类包装器是一个类型的包装器,其中包装器的行为与基础类型相同 - 因此是“透明的”。

解释它,以及它的使用,这里是一个例子,只要它被用来在我们结束了int但超载operator++()输出消息(由this thread启发):

class IntWrapper { 
    int data; 
public: 
    IntWrapper& operator++() { 
     std::cout << "++IntWrapper\n"; 
     data++; 
     return *this; 
    } 

    IntWrapper(int i) : data(i) {} 

    IntWrapper& operator=(const IntWrapper& other) 
    { 
     data = other.data; 
     return *this; 
    } 

    bool operator<(const IntWrapper& rhs) const { return data < rhs.data; } 

    // ... other overloads ... 
}; 

然后我们就可以替代用法的intIntWrapper如果我们选择:

for (int i = 0; i < 100; ++i) { /* ... */ } 
// becomes 
for (IntWrapper i = 0; i < 100; ++i) { /* ... */ } 

除了后者将打印时前增量被称为消息。

请注意,我提供了一个非显式构造函数IntWrapper(int i)。这可以确保,无论何时我使用int(其中IntWrapper是预期的)(例如IntWrapper i = 0),编译器都可以静默地使用构造函数在int之外创建IntWrapper。正是出于这个原因,Google C++风格指南不鼓励使用单参数的非显式构造函数,因为可能会出现您不期望的转换,这会损害类型安全性。另一方面,这正是你想要的透明类包装器,因为你确实希望这两种类型可以很容易地转换。

即:

// ... 
explicit IntWrapper(int i) ... 
// ... 
IntWrapper i = 0; // this will now cause a compile error