在各种情况下,我有一个需要由多个函数处理的对象集合(例如 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 s 至 process_1
和process_2
。到目前为止我考虑过的解决方案包括:
- 使用 C 风格转换或
reinterpret_cast
引用vec
- 编写我自己的引用包装器,其中包含
T& get()
和T const & get() const
而不是T& get() const
- 重构,例如采用包装器而不是 vector 的方法
- 拥有带或不带
const
的 vector 拷贝 - 不使用
const
在reference_wrapper
的论据
这些看起来都不是很优雅。我还能做些什么吗?
最佳答案
范围适配器。
范围适配器将范围作为输入(容器是一个范围,因为它具有 begin
和 end
返回迭代器),并返回具有不同属性的范围。
当您取消引用迭代器时,您会将引用包装器强制转换为 const
变体。
boost
有迭代器可以为您执行此操作(转换迭代器),以及帮助编写一致迭代器的工具,但可以通过一些工作从头开始完成。
一些额外的工作甚至可以保持类型名称的正常。
关于c++ - 使用reference_wrapper 保持常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24352369/