我想在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这是因为我需要使用需要部分特化的模板辅助函数,这在 c++ 中还不允许,没有特殊原因,但在技术上可以使用包装类。为简单起见,上面省略了部分特化。