我试图在C ++中实现D语言关键字inout
的语义(只是为了它的乐趣)。
根据具体情况,它基本上是两件事之一:
在编写begin
和end
等成员函数时非常有用。
我能够相对轻松地创建第一个案例的有效实现(虽然界面肯定不是很漂亮):http://ideone.com/wgaDJJ
然而,第二个似乎是我最好的猜测所不可能的。当你使用模板时,你只能得到这种“自动const过载生成”,但据我所知,你不能模仿“this”这个论点。特别是,您会注意到此代码不工作/编译:http://ideone.com/W4fTa4
想知道:
inout
,关于主题的任何内容)答案 0 :(得分:1)
简短答案
const
和一个非 - const
(基本上是您的上一个示例)。更多详情
您希望在第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分钟标记,尽管您可能希望观看整个背景的内容:)