如何在C++中编写'pass reference by value'包装器?
How can I write a 'pass reference by value' wrapper in C++?
我正在为一个类编写一个编译器,我们决定对我们的变量采用类似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库。它们做类似的包装,但目的略有不同(也更有用)。
- 转到特定页面后,如何将滑动视图的当前索引设置为选项卡栏"by reference"的当前索引?
- 为什么我们必须在C++中将值而不是地址传递到"call by reference"函数中?
- C 语言和 C++ 中的"pass by reference"究竟有什么区别?
- 无法找出 Java 等效的 "passing by reference" 在C++解决这个问题,以及最好的解决方法
- 为什么CPPCHECK说"Function parameter should be passed by reference"?
- std::thread pass-by-reference调用复制构造函数
- getters by reference和getters by copy这两个不同的词
- 为什么隐式"lambda to function pointer conversion"禁止"by reference"捕获静态成员?
- Lambda by reference
- C++:参数传递"passed by reference"
- 为什么程序员说"pass by reference"真的很"passing references by value?"为什么这很重要?
- 提高ptr_vector处理去除"by reference"
- 将特征类型与 boost::bind 一起使用是否会自动违反 Eigen 的"only pass by reference"规则?
- 除了语法,"call by reference"和"call by pointer"在内存方面C++有什么区别吗?
- 采用"pass by reference"值的递归函数的包装函数
- c++ Singleton by reference use
- "return-by-reference"或"pass-by-reference"参数何时与constexpr兼容?
- 如何在 C 语言中模仿C++ "pass array(pointer) by reference"?
- 两个方法声明都"pass by reference"吗?
- Visual Studio 2010 - C++ 函数在销毁后返回有效的'by reference'对象