在此question 中讨论了为什么使用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标准。我还没有得到的是这个成语在实际应用中如何有用。 是否存在可以有效使用此习语的问题,或者应将其视为关键字的“好奇”副作用?
答案 0 :(得分:10)
如果未指定返回类型,则非常有用。例如,未指定调用std::bind
或以前boost::bind
的返回对象。它是一些实现定义的仿函数,但如果不查看实现细节,您实际上无法知道它的类型。在C ++ 11的auto
关键字之前,您可以使用boost::function
作为变量类型来存储bind
的结果,或者您可以将bind
的结果传递给函数它采用模板参数。使用C ++ 11,您可以使用auto
存储结果对象。
因此,如果某个类具有某种内部类型,则不必将实际类型公开给公共API。该类的用户可以简单地使用auto
关键字,API文档可以说类型是“未指定”。这使实际内部类型保持私有实现细节,这通常可以改善封装。
答案 1 :(得分:1)
点击“自动”关键字&amp;子类化提供了这样的特征,“私有类型”的概念似乎不切实际。
在O.O.P.之前,一些开发人员使用(void *)指针将某些类型隐藏到“struct”。另一个更新的案例允许给定类的对象,仅由超类公开。