使用auto公开私有类型:哪里有用?

时间:2012-12-04 18:39:22

标签: c++ c++11 auto

在此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标准。我还没有得到的是这个成语在实际应用中如何有用。 是否存在可以有效使用此习语的问题,或者应将其视为关键字的“好奇”副作用?

2 个答案:

答案 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”。另一个更新的案例允许给定类的对象,仅由超类公开。