gpt4 book ai didi

基于 C++ 策略的设计

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:31 26 4
gpt4 key购买 nike

在 Alexandrescu 基于策略的设计 中,我不理解的是创建没有任何共同点的新类型,在我看来,仍然有很多共同点应该以某种方式表示。

例如,std::stringstd::basic_string<> : 分配器是非常内部的东西,在我看来,使用该类的代码不应知道该类正在使用哪个分配器。

但是因为已经创建了一个新类型,所以假设 std::basic_string_1 , 所有那些传递 std::string& 的方法基本上都坏了,我看不出一个std::basic_string<>的正当理由使用不同的分配器应被视为与 std::basic_string<> 完全不同与另一个分配器。

我的问题是:为什么每个 std::basic_string<> 都没有共同的 parent ? ,这样就可以避免这个问题?通常在我的代码中,当我有一个 Whatever<T> , 我让它继承自 WhateverBase某种形式,什么时候T没有显示在那个类的公共(public)界面上,它工作得很好......

最佳答案

allocator are something very internal and, in my opinion, the code using that class shall not be aware of which allocator that class is using.

这就是为什么通常您不关心,只使用 std::string 的原因.大多数代码不使用自定义分配器,因此这根本不是问题。

正如 Kerrek SB 在评论中指出的那样,您可以选择使用 std::experimental::pmr::string它使用类型删除的分配器,因此隐藏了使用哪种分配器的详细信息。这会产生一些运行时成本,但也有一些优势。

更一般地说,您是对的,基于策略的设计会导致无法互操作的不同类型的激增。有时这是一个问题(有时不是)。处理这个问题的一种方法是编写不关心它是否处理 policy_base_ptr<X, Y, Z> 的通用代码。或 policy_based_ptr<A, B, C> .编写使用“某种智能指针”的通用代码,您不关心确切的类型。但这并不总是一个选项,例如在定义接口(interface)时,您经常需要使用具体类型。

My question is: why there is not common parent for every std::basic_string<>, so that this problem could be avoided? Generally in my code when I have a Whatever<T>, I make it inherits from a WhateverBase of some sort, and when T is not shown on the public interface of that class, it works greatfully...

这意味着您的类是多态的,只知道基类的代码必须通过引用传递它。它不能按值传递,因为它会被切片。这意味着您必须小心对象所有权,并关心引用何时仍然有效,以及谁负责销毁派生类型。

这是您在自己的软件中做出的完全合理的选择,但不适合像 std::string 这样的通用词汇类型。 .字符串可以按值传递并轻松复制至关重要。

关于基于 C++ 策略的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33786819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com