https://stackoverflow.com/a/5780976/1525238に少しずつ追加して、「メイン」クラスがテンプレートで「ヘルパー/インナー」という特殊なユースケースをより適切に解決できるようにしたいと思います。クラスもテンプレート1である必要があります。
と呼ばれるネストされた名前空間を使用し、detail
すべての「ヘルパー」コンテンツをプライベートにし、「メイン」クラスfriend
を「ヘルパー」クラスのaにしました。
template<__MAIN_TEMPLATE_PARAMS__> class Main;
namespace detail {
template<__HELPER_TEMPLATE_PARAMS__> class Helper {
/* All Main templates are friends */
template<__MAIN_TEMPLATE_PARAMS__> friend class Main;
/* Private stuff, not reachable from the outside */
static void privateThing(){
...
}
};
}
template<__MAIN_TEMPLATE_PARAMS__> class Main {
void usePrivateThing(){
detail::Helper<__DESIRED_HELPER_TEMPLATE_PARAMS__>::privateThing();
}
};
プライベートなものはstatic
、コードを短くするためだけに上にあります。それらはインスタンスに非常によく結びついている可能性がありHelper
ます。
振り返ってみると、黒魔術が少ないよりエレガントなソリューションがあることは確かですが、それは特定のアプリケーションに大きく依存します。私はまだ上記をクラスの合法で良いユースケースだと思っていますfriend
。
1これは、部分的な特殊化を必要とするテンプレートヘルパー関数を使用する必要があったためです。これは、特別な理由はありませんが、ラッパークラスで技術的に可能です。簡単にするために、上記では部分的な特殊化を省略しています。