返回类型不同的方法的类型擦除

2023-12-14

我想知道是否存在某种形式的类型擦除来处理具有相同名称和参数但返回不同值的方法,如下面的示例所示(begin and end)。我并不打算在任何地方实际使用它,我只是想知道它是否可能,如果可能的话,将如何完成。

我所知道的类型擦除的唯一形式是拥有指向纯虚拟的指针concept类指向一个model<T>它将调用转发给底层T。然而,这需要所有T包含具有完全相同签名的方法,而在我的示例中,返回类型不同。据我所知,需要类似于虚拟模板函数的东西来完成我所要求的操作,但我可能会遗漏一些东西。

class Iterable
{
    //how would this be defined?
}

int main(int argc, char *argv[])
{
    vector<int> v = {1, 2, 3, 4, 5};
    set<string> s = {"foo", "bar", "baz"};

    Iterable iterable;

    if(argc == 2) iterable = v;
    else iterable = s;


    for(auto val : it)
    { 
        cout << val << ' ';
    }
}

类型擦除可以并且已经在不同上下文中在 C++ 中实现。最常见的方法,用于boost::any, std::function< signature >, std::thread和其他基于非多态类,即类型已删除对象,其中包含指向接口类型的指针。在内部,在构造、分配期间或每当擦除用户类型时,都会实例化并存储接口的实现。

作为一个激励性的简化示例,考虑我们想要创建一个printable类型可用于打印实现的任何类型operator<< to std::cout使用类型擦除。为此我们需要类型printable、内部接口printable_impl_base,以及实际的实现:

// regular polymorphic hierarchy:
struct printable_impl_base {
   virtual ~printable_impl_base() {}
   virtual void print() const = 0;
};
template <typename T>
struct printable_impl : printable_impl_base {
   T copy_to_print;
   printable_impl( T const & o ) : copy_to_print( o ) {}
   virtual void print() const {
      std::cout << copy_to_print << std::endl;
   }
};

// type erasure is performed in printable:
class printable {
   std::shared_ptr<printablable_impl_base> p;
public:
   template <typename T>
   printable( T obj ) : p( new printable_impl<T>(obj) ) {}
   void print() const {
      p->print();
   }
};

请注意,该模式与常规多态层次结构非常相似,不同之处在于界面添加的对象是值类型(借用术语值类型来自 C#),其中包含实际的多态对象。

这样看来,似乎有点简单化和无用,但这就是驱动的燃料boost::any(内部接口只是一个typeid),std::function< void () >(内部接口是它实现void operator()), or shared_ptr<>(该接口是删除器方法,放弃资源)。

当实现类型擦除的类型需要做的唯一一件事就是销毁它时,有一种特定的不同类型的类型擦除:使用临时并将其绑定到常量引用...但这非常具体,如果你想要的可以在这里阅读:http://drdobbs.com/cpp/184403758

在您在问题中讨论的具体情况下,它有点复杂,因为您不想删除单个类型,而是删除其中的几个类型。这Iterable接口必须擦除它内部保存的容器的类型,并且在这样做时,它必须提供自己的迭代器,这些迭代器必须对容器中的迭代器执行类型擦除。不过,想法基本上是一样的,只是需要做更多的工作来实现。

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

返回类型不同的方法的类型擦除 的相关文章

随机推荐

  • 如何在asp:DataGrid中设置单元格的样式?

    我如何设置单元格的 css 样式asp DataGrid 我真正想要实现的目标是什么 一个html table 我在其中控制每个单元格的 html 内容 以及每行和每个单元格的 css 样式 table tr class odd avail
  • Linq to XML,选择给定节点的所有属性及其值

    我有一个 xml 映射文件 看起来像这样
  • 如何使用 python-selenium 从日历中选择特定日期?

    例如 如果我想使用 python selenium 在 www priceline com 中选择特定的入住和退房日期 我该怎么办 这是日历 html 或者您可以在 www priceline com 上找到它
  • 如何通过iOS SDK调用Lambda函数?

    我有一个 iOS 购物应用程序 想要调用 lambda 函数进行日志记录 但我不想通过API网关调用lambda函数来节省成本 是否可以使用Amazon的iOS SDK将日志发送到Lambda 您可以使用 AWS iOS 开发工具包直接调用
  • WP7/Silverlight 超链接图像

    我对 Silverlight 和 WP7 都是新手 我一直在尝试通过使用 HyperlinkBut ton 并将其内容设置为图像来热链接图像 然而 这只会让我的形象消失 重现 创建一个新的 Windows Phone 全景应用程序 在 Ma
  • 输入采用“同一实例”泛型的函数参数

    我有一些非常相似的东西这种类型的事件发射器并想要创建一个保留类型的辅助函数 我将我的尝试放在 TS 播放示例中 转载如下 在我的示例中 我只得到一个通用的eventName string and callback e any gt void
  • 我是否总是必须在 -viewDidLoad 方法中调用 [super viewDidLoad] ?

    在Apple的scrollView示例中 他们没有这样称呼 我一直以为那是一个must 无论如何我为什么要这么称呼呢 如果您要重写该方法 您仍然应该在 super 中调用该方法 即使超类今天没有使用它做任何事情 Apple 也可能有一天会更
  • 嵌套权重对我的 XML 代码的性能不利[重复]

    这个问题在这里已经有答案了 我想显示一个有组织的网格 所以我使用 LinearLayout 和 Layout Weight 选项 一切都很完美 但我不明白如何避免按钮 A 和按钮 C 中的此警告 Nested weights are bad
  • 为什么 `go test -run NotExist` 通过了?

    如果我运行以下命令 go test run NotExist 响应为 通过 鉴于我的测试文件不包含名为的测试TestNotExist我希望上面的命令返回 FAIL 如果没有 run option go test运行所有测试 您使用 run选
  • geom_abline(...) 是否多次绘制数据?

    是否使用geom abline 也geom vline and geom hline 导致 天真 使用时同一行多次过度绘制 例如 假设我们对以下多面散点图感兴趣 library ggplot2 library dplyr k lt 4 da
  • java使用BODMAS吗?

    目前 我正在尝试使用java编程语言制作一个计算器 但是 我需要知道java是否使用BODMAS 以便我知道是否制作一个实现BODMAS的算法或继续制作计算器 java使用BODMAS吗 这是 BODMAS 而不是 BOMDAS 除法在乘法
  • 文档图像二值化[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试寻找有效的文档图像二值化技术 我目前已经实现了 niblack 和 sauvo
  • 在 ASP.NET MVC 中构建自定义授权

    In the DB i have Role and User具有一对多关系的实体 我想做的是构建自定义授权过滤器 我见过的所有教程都是使用默认的ASP NET会员资格 我只知道我需要继承AuthorizationAttribute但不知道我
  • 如何使用 React Router v6 导航到上一页,同时将当前页面的状态传递给它?

    我知道我可以使用navigate 1 来自useNavigate 钩子 导航到上一页 但使用navigate 1 state state 似乎不起作用 因为当我转到上一页时我得到一个空值 The navigate函数有两个函数签名 一个需要
  • 在 PHP 中通过正确的身份验证确保安全登录

    如何在 PHP 中编写 组合安全登录 这网站开发者指南说我不应该自己动手 所以参考通过谷歌提供的示例是没有用的 高手们是如何做到的呢 假设您正在 Rails 中构建一个世界级的应用程序 相同的库 技术可以在这里使用吗 Thanks 在 Ra
  • 无法连接到 StreamSocketListener

    我正在尝试连接到 Windows 10 应用程序中的 StreamSocketListener 如果客户端套接字位于同一应用程序内 则此方法有效 但如果我尝试从另一个应用程序 例如 Putty 连接 它就不起作用 几秒钟后 腻子显示 网络错
  • 在java中使用super.paintComponent(g)或getGraphics()

    我对几件事有点困惑 示例代码 显示了我的问题 这是不可编译的 image private BufferedImage image private Graphics2D graphic private changeImage thread l
  • 有没有办法调用被重写的对象的基类方法? (C++)

    我知道有些语言允许这样做 在C 中可以吗 Yes include
  • 围绕角色旋转图像(JAVA)

    是的 我确实知道您可以使用 AffineTransformation 但是我希望我的剑图像围绕我制作的角色 图形中绘制的黑色块 明显旋转 360 度 而不是仅旋转一圈 基本上我想要一个像泰拉瑞亚那样的旋转系统 我知道如何获取角色的 x 和
  • 返回类型不同的方法的类型擦除

    我想知道是否存在某种形式的类型擦除来处理具有相同名称和参数但返回不同值的方法 如下面的示例所示 begin and end 我并不打算在任何地方实际使用它 我只是想知道它是否可能 如果可能的话 将如何完成 我所知道的类型擦除的唯一形式是拥有