Подтвердить что ты не робот

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

В этом вопросе обсуждалось, почему выставлять закрытый тип с помощью 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;
}

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

4b9b3361

Ответ 1

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

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

Ответ 2

Извлечь ключевое слово "авто" и подклассификацию предоставляет такую ​​функцию, понятие "частные типы" кажется непрактичным.

До O.O.P некоторые разработчики скрывают какой-то тип, используя указатель (void *), до "struct". Еще более обновленные случаи допускали объект данного класса, который был открыт только суперклассом.