Предоставление приватного типа с помощью auto: где это может быть полезно?

В этом вопрос обсуждалось, почему разоблачение частного типа с auto:

#include <iostream>

using namespace std;

class Base {

class PrivateClass {
public:
void bar() { cout << "PrivateClass" << endl; }
};

public:

PrivateClass foo() {
PrivateClass a;
return a;
}

};

int main() {

Base b;
auto p = b.foo();
p.bar();
return 0;
}

отлично подходит по стандарту C ++ 11. Я до сих пор не понимаю, как эта идиома может быть полезна в реальном приложении.
Существуют ли проблемы, при которых эта идиома может эффективно использоваться, или ее следует рассматривать как «любопытный» побочный эффект ключевого слова?

17

Решение

Это может быть полезно, если тип возвращаемого значения не указан. Например, возвращенный объект от вызова std::bindили ранее boost::bind, не указан. Это некоторый определяемый реализацией функтор, но вы не можете знать его тип, не глядя на детали реализации. До C ++ 11 auto ключевое слово, вы могли бы использовать boost::function в качестве типа переменной для хранения результата bindили вы можете передать результат bind к функции, которая принимает аргумент шаблона. С C ++ 11 вы можете сохранить объект результата, используя auto,

Таким образом, если у класса есть некоторый внутренний тип, нет необходимости предоставлять действительный тип общедоступному API. Пользователь класса может просто использовать auto ключевое слово, а в документации API можно сказать, что тип «не указан». Это сохраняет фактический внутренний тип частной реализацией, что часто может улучшить инкапсуляцию.

10

Другие решения

Ключевое слово «auto» & Подклассы предоставляют такую ​​возможность, что понятие «частные типы» кажется непрактичным.

До O.O.P. некоторые разработчики скрывали некоторые типы, используя указатель (void *), в «struct». В других, более обновленных случаях, объект данного класса может быть открыт только суперклассом.

1