为成员函数自动生成const重载

时间:2014-12-26 07:05:26

标签: c++ c++11

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

根据具体情况,它基本上是两件事之一:

  1. “此函数的结果将与其参数之一具有相同的常量。”
  2. “此成员函数的结果与您调用它的实例具有相同的常量。”
  3. 在编写beginend等成员函数时非常有用。

    我能够相对轻松地创建第一个案例的有效实现(虽然界面肯定不是很漂亮):http://ideone.com/wgaDJJ

    然而,第二个似乎是我最好的猜测所不可能的。当你使用模板时,你只能得到这种“自动const过载生成”,但据我所知,你不能模仿“this”这个论点。特别是,您会注意到此代码工作/编译:http://ideone.com/W4fTa4

    想知道:

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

1 个答案:

答案 0 :(得分:1)

简短答案

  1. 不,不。
  2. 几乎相关:方法重载的更多选项将来自Concepts Light。
  3. 实现两个方法重载,一个const和一个 - const(基本上是您的上一个示例)。
  4. 更多详情

    您希望在第2点实现的目标

      

    此成员函数的结果将具有相同的常量   你调用它的实例。

    是更一般的变体:

    根据您调用它的实例的常量,在此方法中执行不同的操作。

    在C ++中执行此操作的唯一方法是使两个方法重载仅在其constness方面有所不同。由于this的类型需要静态知道,因此您无法为this编写一个适用于两种不同类型的方法。即使使用模板方法,您也必须显式写入(或省略)const修饰符,因为没有选项可以根据this的常量自动生成不同的模板实例化。如果您希望能够编写统一的模板方法,则需要以某种方式“externalize” this。基本上你在上一个例子中做了什么。

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

    据我所知,没有特别的建议在下一个标准中实现类似的功能。当涉及到重载时,可能成为C ++ 17的一个新的新增功能是Concepts Light,它确实添加了基于概念重载方法的新方法。请参阅Andrew Sutton关于该主题的一些演示文稿/视频(例如:https://www.youtube.com/watch?v=NZeTAnW5LL0,接近50分钟标记,尽管您可能希望观看整个背景的内容:)