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

Mar*_*ark 10 c++ c++11

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

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

  1. "这个函数的结果将与它的一个参数具有相同的常量."
  2. "这个成员函数的结果与你调用它的实例具有相同的常量."

在编写像beginend等的成员函数时很有用.

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

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

想知道:

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

Dim*_*nov 1

简短的答案

  1. 不,不。
  2. 几乎没有关系:Concepts Light 将提供更多方法重载选项。
  3. 实现两个方法重载,一个const和一个重载const(本质上是您的最后一个示例)。

更多细节

您想在第 2 点中实现什么目标

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

是更一般的变体:

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

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

至于行业标准,你只需要看标准库本身就可以了。例如,所有容器都具有begin()/end()方法的方法重载,仅在常量上有所不同,特别是为了实现您想要的功能。(例如: http: //en.cppreference.com/w/cpp/container/vector/begin

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