gpt4 book ai didi

c++ - 使用 reference_wrapper 的常量正确性

转载 作者:行者123 更新时间:2023-11-30 02:45:34 26 4
gpt4 key购买 nike

在各种情况下,我有一个对象集合(例如 vector )需要由多个函数处理。一些函数需要修改对象,而另一些则不需要。对象的类可以继承自抽象基类。因此,我有这样的东西:

class A
{
public:
virtual void foo() const = 0;
virtual void bar() = 0;

/* ... */
};

void process_1(std::vector<std::reference_wrapper<A>> const &vec);
void process_2(std::vector<std::reference_wrapper<A const>> const &vec);

显然(?)我无法传递 std::reference_wrapper<A> 的相同 vector 给两个 process_1process_2 .到目前为止,我考虑过的解决方案包括:

  • 使用 C 风格转换或 reinterpret_cast关于 vec 的引用
  • 编写我自己的包含 T& get() 的引用包装器和 T const & get() const而不是 T& get() const
  • 重构,例如采用包装器而不是 vector 的方法
  • 具有和不具有 const 的 vector 拷贝
  • 未使用 constreference_wrapper的论点

这些看起来都不是很优雅。还有什么我可以做的吗?

最佳答案

范围适配器。

范围适配器将范围作为输入(容器是一个范围,因为它有 beginend 返回迭代器),并返回具有不同属性的范围。

当您取消引用迭代器时,您会将引用包装器转换为 const 变体。

boost 具有可以为您执行此操作的迭代器(转换迭代器),以及帮助编写符合规范的迭代器的工具,但它可以通过一些工作从头开始完成。

一些额外的工作甚至可以使类型名称保持正常。

关于c++ - 使用 reference_wrapper 的常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24352369/

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