C++可变参数模板类如何将参数包内所有类型声明为友元
问题解答
你之前实现的单参数版本友元模板类是完全正确的,在此基础上实现可变参数版本的多类型友元声明完全可行,不需要复杂的模板递归或者辅助类,C++11及之后的标准原生支持在友元声明位置直接展开可变参数包。
实现方法
你只需要在友元声明的位置,通过Ts...的语法直接展开类型参数包即可,展开后等价于为参数包中的每一个类型单独声明友元,和单参数Secret类的友元逻辑完全一致。
补全后的完整代码如下:
template <typename... Ts> class MultiSecret { private: // 展开参数包,将Ts中所有类型声明为当前类的友元 friend Ts...; MultiSecret() = default; };
权限效果说明
上述实现完全符合需求:
- 只有被列在
Ts参数包中的类型,能够访问MultiSecret的私有构造函数,创建类实例 - 所有不在参数包中的外部类型,尝试构造
MultiSecret实例时都会触发编译期的访问权限错误 - 该实现和单参数版本的
Secret类行为完全对齐,没有额外的运行时开销
如果参数包中混入了int、float这类内置类型也不会引发编译错误,只是内置类型不存在成员函数,自然不会访问到类的私有成员,不会破坏权限逻辑。
内容的提问来源于stack exchange,提问作者Aleksander Krauze
相关产品推荐
相关产品推荐

