C ++ Transparent Class Wrapper有什么用?

时间:2013-05-07 03:47:32

标签: c++

  1. C ++中的“透明类包装器”是什么
  2. 为什么称它为“透明......”
  3. 它的用途是什么(没有'透明类包装器'也是如此)。
  4. 欣赏一些概念性解释。

2 个答案:

答案 0 :(得分:4)

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

为了解释它及其用法,这里是一个示例,我们将int包装但重载operator++()以便在使用时输出消息(受this thread启发):< / p>

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 ...
};

如果我们选择,我们可以将int的用法替换为IntWrapper

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

除非后者在调用preincrement时打印一条消息。

请注意,我提供了非显式构造函数IntWrapper(int i)。这确保了每当我使用期望int的{​​{1}}(例如IntWrapper)时,编译器可以静默使用构造函数从IntWrapper i = 0中创建IntWrapper {1}}。正是由于这个原因,Google C ++样式指南不鼓励单参数非显式构造函数,因为可能存在您不期望的转换,这会损害类型安全性。另一方面,这正是透明类包装器所需要的,因为您确实希望这两种类型可以轻松转换。

那是:

int

答案 1 :(得分:0)

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