限制可变参数模板类中的构造函数访问

工作和

我想创建一个静态检查的构建器。遵循以下原则:

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<>();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在可变参数模板类的构造函数中初始化元组成员

可变参数模板类和调用构造函数中的多重继承

从可变参数模板构造类

如何访问可变参数模板函数中的参数

如何在SWIG中包装可变参数模板类的可变参数模板成员函数?

可变参数模板类中的派生(虚拟)函数参数

编写可变参数模板构造函数

命名空间和类中的可变参数模板函数

我的可变参数模板构造函数隐藏了复制构造函数,防止类被复制

值包装器的可变参数模板构造函数的类构造函数优先级

带有可变参数模板构造函数的推导指南和可变参数类模板-参数包长度不匹配

可变参数模板类-可变参数成员函数

可变参数模板中的函数顺序

具有左值和右值的可变参数模板类构造函数

是否可以从可变参数模板调用多个基类构造函数?

没有用于初始化可变参数模板类的匹配构造函数

在C ++中可变参数模板中是否有对函数参数实施类型限制的好方法?

可变参数模板构造函数优先级

通过可变参数模板的C ++ 11构造函数继承

可变参数模板递归构造函数问题

如何检查类型是否从模板函数中的某个可变参数模板类实例化?

如何在非变量模板类中形成可变参数模板函数?

如何在C ++中调用可变参数模板构造函数?

在C ++中没有匹配的构造函数来初始化可变参数模板

使用可变参数类模板的模板参数调用可变参数函数模板?

可变参数模板类的可变参数模板

可变参数模板与类中的函数参数数量相同

2个用于类构建的模板化构造函数与可变参数模板的组合。怎么样?

限制可变参数模板参数