如何在C++中编写'pass reference by value'包装器?

How can I write a 'pass reference by value' wrapper in C++?

本文关键字:by reference value 包装 pass C++      更新时间:2023-10-16

我正在为一个类编写一个编译器,我们决定对我们的变量采用类似java的语义。基本上,读操作的行为类似指针解引用,写操作的行为类似指针赋值。

那么,我如何编写一个具有这些语义的包装器类呢?基本上,除了赋值之外,每个操作符都将传递给解引用值。

编辑:这将是一个模板类,包装给定类型的变量。给它分配一个变量,然后使用包装器代替变量。其目的是使包含指向原始变量的指针的包装器具有与java变量相同的语义。

主要说明:编译器正在将我们的语言翻译成c++,而这个类将在翻译后的代码中使用。

首先,我完全反对任何将c++变成Java (c#基本上就是Java)的尝试,而且我对放弃c++的值语义的想法尤其感到困惑,因为RAII的最有用的用途本质上需要值语义,这不是我想要放弃的东西。但是,为了讨论的缘故,让我们看看能做些什么。

现在,您必须意识到引用语义几乎需要某种形式的垃圾收集。您可以不使用它来实现它,但是它会非常脆弱并且/或者到处都是泄漏。在c++中实现这一点的一个简单方法是使用引用计数智能指针,即boost::shared_ptr或std::tr1::shared_ptr(它们是相同的)。

将包含类型的所有操作符带入"ref"类型的最简单方法是简单地提供到包含类型的隐式转换。这样,如果调用任何操作符,编译器将隐式解引用指针并使用底层操作符。您可能仍然需要提供某种类型的get()函数来显式地执行此操作,因为隐式转换的功能和适用性并不是在任何地方都有效。

然后,由于任何直接作用于"ref"类的操作符(没有隐式地转换为T&)将优先于T&上的操作符,因此您可以自由地实现您希望实现的这些特殊的奇怪语义操作符。

看看Boost之类的类。Ref,提振。Any和Boost。变体,来自Boost库。它们做类似的包装,但目的略有不同(也更有用)。