首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象工厂改进

抽象工厂改进
EN

Stack Overflow用户
提问于 2015-04-19 03:19:11
回答 1查看 102关注 0票数 1

编辑:我决定为将来的读者编辑这篇文章。简而言之,它展示了在模板列表中调用模板类型的构造函数的一种可接受的方法。例如,以下内容:

代码语言:javascript
复制
int main()
{
    unique_ptr<factory> real_widget_factory(new widget_factory(5.0, 6.0));
}

而不是仅仅局限于:

代码语言:javascript
复制
    unique_ptr<factory> real_widget_factory(new widget_factory()); // empty
EN

回答 1

Stack Overflow用户

发布于 2015-04-19 06:45:04

该标准提供了您所需的所有必要基础设施。您可以删除所有这些代码。

代码语言:javascript
复制
template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(std::forward<Args>(args)...);
}
struct train_factory {
    train_factory(std::function<std::unique_ptr<locomotive>()> ml,
        std::function<std::unique_ptr<freight_car>()> mc)
        : make_locomotive(std::move(ml)),
        , make_car(std::move(mc)) {}
    std::function<std::unique_ptr<locomotive>()> make_locomotive;
    std::function<std::unique_ptr<freight_car>()> make_car;
};
train_factory make_concrete_factory(double x1, double x2) {
    return train_factory(
        [=] { return make_unique<real_locomotive>(x1); },
        [=] { return make_unique<real_car>(x2); }
    );
}
int main() {        
    auto fact = make_concrete_factory(1.0);
    auto loc = fact.make_locomotive();
}

这似乎满足了您的所有要求。在这种情况下,函数具有绑定到中的工厂的参数(此绑定是任意的)。当然,如果您愿意,也可以修改函数以获取参数,或者以任意方式和组合使用这两个参数。

代码语言:javascript
复制
struct train_factory {
    std::function<std::unique_ptr<locomotive>(double)> make_locomotive;
    std::function<std::unique_ptr<freight_car>(double)> make_car;
};
train_factory make_concrete_factory() {
    return train_factory {
        [](double x1) { return make_unique<real_locomotive>(x1); },
        [](double x2) { return make_unique<real_car>(x2); }
    };
}
int main() {        
    auto fact = make_concrete_factory();
    auto loc = fact.make_locomotive(1.0);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29721717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档