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 以降では auto
や decltype
で private
な型も使える。
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; }
auto
や decltype
を通じてでも foo::bar
という型を外で利用できなくする方法というのはあるだろうか?
Document ID: 10255bcb2ece0cf1d51420c8189eb2a2