c++ - 使用reference_wrapper 保持常量正确性

标签 c++ c++11 reference-wrapper

在各种情况下,我有一个需要由多个函数处理的对象集合(例如 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_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/

相关文章:

c++ - Qt项目自定义共享库交叉编译Qt

c++ - C++ 中的 Lambda 函数

c++ - Visual Studio 在 C++ 项目中自动为什么生成数据库文件?

使用带有虚函数的协变返回类型的 C++ 无效转换错误

c++ - 为什么非静态数据成员不能是 constexpr?

c++ - 关于 std::reference_wrapper 移除的设计

c++ - ROS 订阅回调 - 使用 boost::bind 和成员函数

c++ - 在 C++ (Linux) 中使用 Matlab 库

c++ - 错误 : name lookup of ‘x’ changed for ISO ‘for’ scoping