型を隠せるか

C++ ではクラス定義時に private としたメンバには外からはアクセスできない。 そのメンバへの参照やポインタを作って外へ漏らしたりしない限りあくまで内部的なデータである。 (メモリレイアウトを知っていれば無理矢理にアクセスすることは出来なくもないが、それは言語の範囲外の話ということでとりあえず置く。)

そして型についてもまたクラスの private 要素として定義することが出来る。 たとえば

#include <iostream>

class foo {
private:
  class bar {};
public:
  static bar make_bar(void) {
    return bar();
  }
  static void print_bar(bar) {
    std::cout << "bar" << std::endl;
  }
};

という定義を作ったときは foo::bar という型を隠したいという意図がある。 foo::bar という型に外からアクセスできないのだから、 foo::bar 型の変数を foo の外で作ることは出来ない。 foo::make_bar が返した値は捨てるか foo::print_bar が受け取る以外の使い方は出来ない。 …… C++03 までは。

C++11 以降では autodecltypeprivate な型も使える。

int main(void) {
  foo::make_bar(); // OK
  foo::print_bar(foo::make_bar()); // OK
  foo::bar x = foo::make_bar(); // foo::bar は private なのでエラー
  auto x = foo::make_bar(); // C++11 からは auto が使える
  decltype(foo::make_bar()) y = foo::make_bar(); // C++11 からは decltype が使える

  return 0;
}

autodecltype を通じてでも foo::bar という型を外で利用できなくする方法というのはあるだろうか?

Document ID: 10255bcb2ece0cf1d51420c8189eb2a2