Предоставление частного типа с авто: где это может быть полезно?
В этом вопросе обсуждалось, почему выставлять закрытый тип с помощью 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. Я до сих пор не понимаю, как эта идиома может быть полезной в реальном приложении.
Существуют ли проблемы, когда эта идиома может быть эффективно использована или ее следует рассматривать как "любопытный" побочный эффект ключевого слова?
Ответы
Ответ 1
Это может быть полезно, если тип возврата не указан. Например, возвращаемый объект из вызова std::bind
или ранее boost::bind
не указан. Это определенный функционал, определенный реализацией, но вы не можете знать его тип, не глядя на детали реализации. Перед ключевым словом С++ 11 auto
вы можете использовать boost::function
как тип переменной для хранения результата bind
, или вы можете передать результат bind
функции, которая принимает аргумент шаблона. С С++ 11 вы можете сохранить результат с помощью auto
.
Итак, если класс имеет некоторый внутренний тип, нет необходимости подвергать действительный тип публичному API. Пользователь класса может просто использовать ключевое слово auto
, и в документации API можно сказать, что тип "неуказан". Это сохраняет фактический внутренний тип частной детали реализации, которая часто может улучшить инкапсуляцию.
Ответ 2
Извлечь ключевое слово "авто" и подклассификацию предоставляет такую функцию, понятие "частные типы" кажется непрактичным.
До O.O.P некоторые разработчики скрывают какой-то тип, используя указатель (void *), до "struct". Еще более обновленные случаи допускали объект данного класса, который был открыт только суперклассом.