首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构件函数const过载的自动生成

构件函数const过载的自动生成
EN

Stack Overflow用户
提问于 2014-12-26 07:05:26
回答 1查看 420关注 0票数 10

我试图在inout中实现D语言关键字C++的语义(只是为了好玩)。

根据上下文的不同,它本质上说了两件事中的一件:

  1. “这个函数的结果将与它的一个论点具有同样的一致性。”
  2. “此成员函数的结果将与调用它的实例具有相同的一致性。”

在编写beginend等成员函数时非常有用。

我能够相对轻松地创建第一种情况的有效实现(尽管接口确实不漂亮):http://ideone.com/wgaDJJ

然而,据我所知,第二种情况似乎是不可能的。您只能在使用模板时获得这种“自动const重载生成”,但据我所知,您不能在" this“参数上使用模板。特别是,您将注意到这段代码不工作/编译:http://ideone.com/W4fTa4

我在想:

  1. 我错过了什么吗?是否可以在不使用宏或代码重复的情况下实现第二种情况?
  2. 有人知道在这个问题上是否有WG21标准提案吗?(不一定是inout,只是任何关于主题的内容)
  3. 处理这个问题的行业标准是什么?(这里有一个可能不是那么可怕的选择:http://ideone.com/PW0vK4)
EN

Stack Overflow用户

发布于 2015-01-22 16:50:57

简短答案

  1. 不和不。
  2. 几乎没有关联:方法重载的更多选项将随概念之光而来。
  3. 实现两个方法重载,一个const和一个非const(本质上,你的最后一个例子)。

详细信息

你在第2点想要达到的目标

该成员函数的结果将与调用它的实例具有相同的一致性。

是一个更一般的变体:

根据调用该方法的实例的一致性,在此方法中执行一些不同的操作。

在C++中实现这一目的的唯一方法是有两个方法重载,它们的一致性不同。由于需要静态地知道this的类型,所以不能编写一个用于this的两种不同类型的方法。即使使用模板方法,也必须显式地编写(或省略) const修饰符,因为没有选项可以根据this的一致性自动生成不同的模板实例化。如果您想要编写统一的模板方法,您需要以某种方式“外部化”this。基本上,你在上一个例子中所做的。

至于行业标准,您只需查看标准库本身。例如,所有容器都有begin()/end()方法的方法重载,这些方法仅因一致性而不同,特别是为了实现所需的功能。(例如:http://en.cppreference.com/w/cpp/container/vector/begin)

据我所知,没有人特别建议在下一个标准中实施类似的功能。当涉及到重载时,一个很大的新添加可能使它成为C++17的概念之光,它确实添加了基于概念的重载方法的新方法。查看安德鲁·萨顿( Andrew )关于这个主题的一些演示文稿/视频(例如:https://www.youtube.com/watch?v=NZeTAnW5LL0,接近50分钟,尽管你可能想看整件事情的背景:)

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27653943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档