为基类设计一个基迭代器

2024-02-12

我目前正在设计一个界面(Base在下面的示例中)它提供了一些虚拟方法,包括begin() and end()。这两个方法简单地返回相应的迭代器,就像在任何其他集合类中一样。派生类应该实现这些方法并返回其迭代器的特定实现。

下面的(简化的)示例显示了一个派生类,它使用boost::transform_iterator转换私有内部整数列表。这个实现只是一个例子,实际上迭代的“事物”可以是其他东西,迭代器也是如此。

该示例有效,但我有一个问题。对象类型在main()不隐藏所使用的迭代器是类型的事实TransformIterator。基类将用于某种插件架构,其中每个插件都是一个共享库。插件不应该知道使用哪种类型的迭代器,并且应该仅依赖于抽象接口。有没有办法做到这一点?

#include <boost/iterator/transform_iterator.hpp>

#include <iostream>
#include <string>
#include <vector>

template<class Iterator>
class Base
{
public:
    virtual Iterator begin() = 0;
    virtual Iterator end() = 0;
};

struct toString
{
    std::string operator()(int number) const
    {
        return std::to_string(number);
    }
};

typedef boost::transform_iterator<toString, std::vector<int>::iterator> TransformIterator;

class Derived : public Base<TransformIterator>
{
public:
    Derived() : ints{132, 3, 6451, 12, 5} {}

    TransformIterator begin()
    {
        return boost::make_transform_iterator(ints.begin(), toString());
    }

    TransformIterator end()
    {
        return boost::make_transform_iterator(ints.end(), toString());
    }

private:
    std::vector<int> ints;
};

int main()
{
    Base<TransformIterator>* obj = new Derived();
    for(const auto& value : *obj)
    {
        std::cout << value.size() << std::endl;
    }
    return 0;
}

更多背景知识:这个具体示例基于读取配置文件的接口。目前我只计划提供 YAML 文件的实现,但其他格式(如 XML 或老式 INI)也是可能的。因此有一个通用的接口。


我最近在我的一个工作项目中做了一些非常类似的事情。我的方法是引入一个抽象迭代器接口和一个用于访问该接口的迭代器的类。这是一个简化版本:

template <class ValueType>
struct AbstractIterator
{
  virtual ValueType& dereference() const = 0;
  virtual void increment() = 0;
  // and so on...
};


template <class ValueType>
struct ClientIterator : public std::iterator<whatever>
{
  std::unique_ptr<AbstractIterator<ValueType>> it;

  ClientIterator(std::unique_ptr<AbstractIterator<ValueType>> it) : it(std::move(it)) {}

  ValueType& operator* const () { return it->dereference(); }
  ClientIterator& operator++ () { it>increment(); return *this; }

  // and so on...
};

struct Base
{
  typedef ClientIterator<std::string> Iterator;
  virtual Iterator begin() = 0;
  virtual Iterator end() = 0;
}


struct Derived : Base
{
  struct ServerIterator : AbstractIterator<std::string>
  {
    boost::transform_iterator<toString, std::vector<int>::iterator> it;

    virtual std::string& dereference() const override { return *it; }
    virtual void increment() override { ++it; }
  }

  virtual Iterator begin() override { return Iterator({new ServerIterator(something)}); }
  virtual Iterator end() override { return Iterator({new ServerIterator(anotherThing)}); }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为基类设计一个基迭代器 的相关文章

  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • 了解 mod_proxy 和 Apache 2 以编写 comet-server

    我目前尝试为某种类型实现一个简单的 HTTP 服务器comet http en wikipedia org wiki Comet programming 技术 长轮询 XHR 请求 作为JavaScript对于跨域请求非常严格我有几个问题
  • Python/Tkinter - 单击时识别对象

    我正在尝试创建一个程序 根据先前的颜色将单击时的对象颜色从白色更改为黑色或从白色更改为黑色 我希望程序仅在对象是矩形时才更改颜色 我怎样才能让这一切发生 这是我的代码 import tkinter as tk root tk Tk cv t
  • 如何从firebase实时数据库获取字符串数组

    databaseReference FirebaseDatabase getInstance getReference sample databaseReference addValueEventListener new ValueEven
  • Python Pandas:当日期小于 13 时,pandas.to_datetime() 会切换日期和月份

    我编写了一个读取多个文件的代码 但是在我的一些文件中 每当日期小于 13 时 日期时间就会交换日期和月份 并且从第 13 天或以上开始的任何一天 即 13 06 11 仍然正确 DD MM YY 我试图通过这样做来修复它 但它不起作用 我的
  • django admin - 您无权编辑任何内容

    我跟着Django 文档 https docs djangoproject com en 1 8 topics auth customizing a full example创建自定义用户模型 同时使用我自己的字段扩展模型本身 于是就变成了
  • 在本地主机上启动 Jupyter Notebook 会导致“[Errno 49] 无法分配请求的地址”,但 ip=127.0.0.1 有效

    尝试启动 Jupyter Notebook 时出现以下错误 Jupyter Notebook Traceback most recent call last File Library Frameworks Python framework
  • ASP.Net Core JWT 令牌验证

    我需要验证在请求中收到的多个令牌 我遵循以下代码流程 services AddAuthentication AddJwtBearer Token1 options gt options TokenValidationParameters n
  • 是否可以调用不在 MATLAB 路径中的函数?

    我安装了一个库 其中有一些与 MATLAB 同名的函数 通过安装库 我的意思是添加路径 当我尝试调用这些函数时 它将使用该库的实现 但我想调用 MATLAB 实现 为了更简单 如果我有两个函数的绝对地址 如何指定要调用哪个函数 我搜索了答案
  • Github 访问错误 - 遇到 AggregateException [重复]

    这个问题在这里已经有答案了 我使用 github 存储库已经快一年了 从今天早上开始 我无法将我的代码推送到远程存储库 我在命令行中收到以下错误 致命 遇到 AggregateException Mindestens ein Fehler
  • 在使用 Inno Setup 安装期间报告已安装的 .NET Framework 版本

    我正在尝试使用 Inno Setup 来准备创建安装程序 我的第一次尝试是向用户报告当前安装了哪个 NET Framework 我想出了以下脚本 它安装了一个令牌 exe 但它没有显示我想要显示已安装的框架版本的消息框 Setup AppN
  • 使用 ECTO 和 put_assoc/4 进行多对多

    我尝试将 2 个现有多对多记录与 ECTO 和 put assoc 4 关联 但在尝试更新时不会删除元素 基本上我有项目和用户 为了管理用户对项目的访问 我有表 user project def Project do schema proj
  • 如何使用 Keras 预测函数/表?

    我目前正在学习keras 我的目标是创建一个简单的模型来预测函数的值 首先 我创建两个数组 一个用于 X 值 一个用于相应的 Y 值 declare and init arrays for training data X np arange
  • 从python中的字符串中获取两个字符[重复]

    这个问题在这里已经有答案了 如何在Python中从字符串中获取不是一个字符 而是两个字符 I have long str abcd for c in long str print c 它给了我喜欢 a b c d 但我需要得到 ab cd
  • 如何调试 Visual Studio 扩展

    我正在为 Visual Studio 2010 编写 VSIX 扩展 但不知道如何调试它 一种明显的方法是输出消息 扩展模板使用Trace WriteLine 但是在哪里可以找到它的输出呢 Visual Studio Extensions
  • 如何在新窗口中使用jspdf打开生成的pdf

    我在用jspdf生成 pdf 文件 一切都运转良好 但生成后如何打开 pdf 在新选项卡或新窗口中 我在用 doc output datauri 这是在同一选项卡中打开 pdf 根据来源 您可以将 dataurlnewwindow 参数用于
  • 从 csv 文件中删除字母和符号 - python 3.7

    我有一个 CSV 文件 其中有一列名为activity其中有如下数据 instv2 02 00001 20190517235008 instv2 9 Insti2 3 Fbstt1 00001 20190517131933 我需要仅从 活动
  • 如果输入包含数组中的任何单词

    我有一个输入 我想知道数组中是否存在任何值 举个简单的例子 我的数组是 var array sun mon tue wed thu fri sat 例如 我已经弄清楚如果我简单地输入 sun 如何触发它 但我想知道 hhsun 或 sune
  • 定义交换运算时减少代码重复

    我有一组名为的可交换二元函数的重载overlap 它接受两种不同的类型 class A a class B b bool overlap A B bool overlap B A 我的功能overlap当且仅当一个形状与另一个形状重叠时返回
  • 宏函数和内联函数在执行速度方面有什么区别?

    编译器如何通过宏处理内联函数以减少执行时间 编译器也被允许not如果这样做会更快 则内联函数 而编译器不能不内联宏 此外 内联函数比宏安全得多
  • 为基类设计一个基迭代器

    我目前正在设计一个界面 Base在下面的示例中 它提供了一些虚拟方法 包括begin and end 这两个方法简单地返回相应的迭代器 就像在任何其他集合类中一样 派生类应该实现这些方法并返回其迭代器的特定实现 下面的 简化的 示例显示了一