欣赏一些概念性解释。
答案 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)
最有可能的是,你指的是一个轻量级的内联(头文件)包装类,虽然我不熟悉这个术语。添加这样的抽象级别对于允许通用客户端代码很有用。