Прозрачная оболочка класса - это оболочка вокруг типа, где обертка ведет себя так же, как и базовый тип - отсюда «прозрачный».
Чтобы объяснить это, а также ее использование, вот пример, где мы оборачиваем перегрузку operator++()
int
но выводить сообщение всякий раз, когда он используется (вдохновленный 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 ...
};
Затем мы можем заменить использований из int
с IntWrapper
если мы выбираем:
for (int i = 0; i < 100; ++i) { /* ... */ }
// becomes
for (IntWrapper i = 0; i < 100; ++i) { /* ... */ }
За исключением последнего напечатает сообщение всякий раз, когда прединкремента называется.
Обратите внимание, что я предоставил неявный конструктор IntWrapper(int i)
. Это гарантирует, что всякий раз, когда я использую int
, где ожидается IntWrapper
(например, IntWrapper i = 0
), компилятор может молча использовать конструктор для создания IntWrapper
из int
. Руководство по стилю Google C++, по этой причине, не поддерживает явные конструкторы с одним аргументом, поскольку возможны конверсии, в которых вы не ожидали, что создает угрозу безопасности типов. С другой стороны, это именно то, что вы хотите для прозрачных оболочек классов, потому что вы хотите, чтобы эти два типа были легко конвертируемыми.
То есть:
// ...
explicit IntWrapper(int i) ...
// ...
IntWrapper i = 0; // this will now cause a compile error
Этот термин я получил от '++ стиль Руководство Google C'. он говорит: «Мы требуем, чтобы все конструкторы одиночных аргументов были явными. Исключение составляют классы, которые предназначены для прозрачных оболочек вокруг других классов». FYI http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Explicit_Constructors#Explicit_Constructors. Так что мне любопытно, что такое 'Transparent Class Wrapper' –