限制variadic模板类中的构造函数访问
restrict constructor access in variadic template class
我想创建一个静态检查的生成器。大致如下:
class HasDough;
class HasCheese;
template <typename ... CurrentTypes>
class Pizza {
public:
friend Pizza<> startPizzaMaking();
Pizza<HasDough, CurrentTypes ...> addDough(){
return Pizza<HasDough, CurrentTypes ...>();
}
Pizza<HasCheese, CurrentTypes ...> addCheese(){
return Pizza<HasCheese, CurrentTypes ...>();
}
public: // I want to change to private
Pizza() = default;
};
Pizza<> startPizzaMaking() {
return Pizza<>();
}
这样使用:
int main(){
auto pizza = startPizzaMaking()
.addDough()
.addCheese();
return 0;
}
现在我可以使用析取来检查当前的类型了。这样我就可以确保添加所有内容。
我的问题是:每走一步,我都会创建一个新的构建器实例,并希望传递我的当前状态。为此,构造函数应该是私有的,我会使用friend函数来获得一个新的构造函数。
我如何限制对构造函数的访问以迫使其他人使用工厂,但在内部我仍然可以使用它?
[更新]
简单地将构造函数设为私有是行不通的。代码将扩展到如下内容:
Pizza<HasDough>::addCheese() {
return Pizza<HasCheese, HasDough>(); // fine with public constructor, not so with private
}
不同的类模板专业化是完全独立的类,不能访问彼此的内部。幸运的是,总有朋友可以拯救你的一天。
template <typename ... CurrentTypes>
class Pizza {
public:
friend Pizza<> startPizzaMaking();
Pizza<HasDough, CurrentTypes ...> addDough(){
return Pizza<HasDough, CurrentTypes ...>();
}
Pizza<HasCheese, CurrentTypes ...> addCheese(){
return Pizza<HasCheese, CurrentTypes ...>();
}
private: // OK
Pizza() = default;
friend Pizza<> startPizzaMaking();
// make every specialisation a friend of every other <=== this here trick
template <typename ...> friend class Pizza;
};
Pizza<> startPizzaMaking() {
return Pizza<>();
}
相关文章:
- 固有构造函数的字符和访问级别
- C++:为什么无法在派生类中访问受保护的构造函数?
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- c++ cuda:cudaMalloc在构造函数之外的托管访问
- 使用值初始化访问构造函数?
- 限制variadic模板类中的构造函数访问
- 构造函数无法访问继承类私有 int
- 从派生类访问模板基类的构造函数
- 如何在构造函数中访问类变量以分配它们,而无需在C++中使用此指针
- 访问在构造函数期间创建的值 - C++
- 从析构函数访问模板类构造函数的参数,可以吗?
- 仅当构造函数具有参数时,C++ 公共成员才能访问
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- 在派生类的构造函数初始化中无法访问受保护的函数
- 是否可以从 C++ 中的构造函数访问对象名称?
- 从构造函数访问值
- 聚合初始化不支持构造函数访问
- 无法从构造函数访问私有变量 - 不在范围(C )中
- c++工厂.子构造函数不能从父构造函数访问
- 如何通过类构造函数访问私有静态成员变量