Эффективный C++: пункт 41 - путаница с неявными интерфейсами
Я читаю Effective C++, пункт 41 с заголовком "Понимание неявных интерфейсов и полиморфизм во время компиляции". Он дает объяснение этому примеру и следующему, но я не понимаю эту часть.
template<typename T>
void doProcessing(T& w)
{
if (w.size() > 10 && w != someNastyWidget) {
...
..., T должен поддерживать функцию-член размера, ....., но эта функция-член не должна возвращать целочисленный тип. Не нужно даже возвращать числовой тип. В этом отношении ему даже не нужно возвращать тип, для которого оператор
>
определено! Все, что нужно сделать, это вернуть объект некоторого типа x, такой, что есть оператор>
который может быть вызван с и объектом типа x и int...
Не могли бы вы объяснить, о чем идет речь, и привести больше примеров?
1 ответ
Это означает, что T::size()
функция может вернуть все, что можно сравнить (используя >
) для int
значение.
Давайте посмотрим на три примера:
Вернуть
int
:struct MyT { // Some stuff... int size() { return some_calculation_returning_int(); } // Some more stuff... };
Вернуть объект, который можно преобразовать в
int
:struct MySizeType { // Some stuff... operator int() { return some_calculation_returning_int(); } // Some more stuff... }; struct MyT { // Some stuff... MySizeType size() { return MySizeType(); } // Some more stuff... };
Вернуть объект, который можно сравнить с
>
дляint
:struct MyOtherSizeType { // Some stuff... operator>(int other) { return some_calculation_returning_int() > other; } // Some more stuff... }; struct MyT { // Some stuff... MyOtherSizeType size() { return MyOtherSizeType(); } // Some more stuff... };
Хотя должно быть совершенно ясно, что можно использовать первый вариант, можно использовать и два других. Это потому, что они, так или иначе, возвращают что-то, что можно сравнить с int
значение.
Если мы "расширим" три варианта:
w.size() > 10
просто так, как есть.w.size() > 10
будетw.size().operator int() > 10
, ЗдесьMySizeType::operator int()
функция преобразования будет использоваться для преобразованияMySizeType
возражать противint
значение, которое можно сравнить.w.size() > 10
будетw.size().operator>(10)
, ЗдесьMyOtherType::operator>()
Функция будет использоваться для самого сравнения.
Ссылка