我试图在inout
中实现D语言关键字C++的语义(只是为了好玩)。
根据上下文的不同,它本质上说了两件事中的一件:
在编写begin
和end
等成员函数时非常有用。
我能够相对轻松地创建第一种情况的有效实现(尽管接口确实不漂亮):http://ideone.com/wgaDJJ
然而,据我所知,第二种情况似乎是不可能的。您只能在使用模板时获得这种“自动const重载生成”,但据我所知,您不能在" this“参数上使用模板。特别是,您将注意到这段代码不工作/编译:http://ideone.com/W4fTa4
我在想:
inout
,只是任何关于主题的内容)发布于 2015-01-22 16:50:57
简短答案
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分钟,尽管你可能想看整件事情的背景:)
https://stackoverflow.com/questions/27653943
复制相似问题