【问题标题】:Automatic generation of const overload for member function为成员函数自动生成 const 重载
【发布时间】:2015-01-23 00:50:57
【问题描述】:

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

根据上下文,它基本上说的是两件事之一:

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

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

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

然而,根据我的最佳猜测,第二个似乎是不可能的。当您使用模板时,您只能获得这种“自动 const 重载生成”,但据我所知,您不能对“this”参数进行模板化。特别是,您会注意到此代码工作/编译:http://ideone.com/W4fTa4

想知道:

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

【问题讨论】:

  • IMO 的行业标准是复制函数,从非常量调用 const 一,然后 const_cast 解决问题。它只是简单的损坏,绝不可接受。需要一种语言机制。
  • 对于方法,您必须为this显式添加const,而对于参数,可以在模板中推断出常量。

标签: c++ c++11


【解决方案1】:

简答题

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

更多详情

你想在第 2 点实现的目标

此成员函数的结果将具有与 您调用它的实例。

是更一般的变体:

根据你调用它的实例的常量,在这个方法中做一些不同的事情。

在 C++ 中做到这一点的唯一方法是有两个方法重载,它们的常量不同。由于需要静态知道this 的类型,因此您不能编写一个方法来处理this 的两种不同类型。即使使用模板方法,您也必须显式编写(或省略)const 修饰符,因为没有选项可以仅基于this 的常量来自动生成不同的模板实例化。如果您希望能够编写统一的模板方法,则需要以某种方式“externalize” this。基本上是您在上一个示例中所做的。

至于行业标准,您只需要查看标准库本身即可。例如,所有容器都有 begin()/end() 方法的方法重载,这些方法仅在常量上有所不同,专门用于实现您想要的功能。 (例如:http://en.cppreference.com/w/cpp/container/vector/begin

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

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 2016-02-26
    • 2011-06-04
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多