我正在为一个类编写一个编译器,我们决定对我们的变量采用类似java的语义。基本上,读取的行为类似于指针解除引用,并且写入的行为类似于指针赋值。
那么,我怎样才能编写一个具有这些语义的包装类?基本上,除赋值之外的每个运算符都将传递给解除引用的值。
编辑:这可能是一个包装给定类型变量的模板类。您为它分配一个变量,然后在变量的位置使用包装器。目的是包含指向原始变量的指针的包装器将具有与java变量相同的语义。
主要澄清:编译器正在将我们的语言翻译成C ++,这个类将用于翻译的代码中。
答案 0 :(得分:1)
首先,我完全反对任何将C ++变成Java的尝试(基本上就是C#),我特别对放弃C ++的价值语义的想法感到困惑,因为最有用的RAII的使用本质上需要价值语义,这不是我想要放弃的东西。但是,为了论证,让我们看看可以做些什么。
现在,你必须意识到引用语义几乎需要某种形式的垃圾收集。你可以在没有它的情况下实现它,但它会非常脆弱和/或泄漏到处。在C ++中执行此操作的一种简单方法是使用引用计数的智能指针,即boost :: shared_ptr或std :: tr1 :: shared_ptr(它们是相同的)。
将包含类型的所有运算符传递到“ref”类型的最简单方法是简单地提供对包含类型的隐式转换。这样,如果调用任何运算符,编译器将隐式取消引用指针并使用底层运算符。您可能仍需要提供某种get()函数来明确地执行此操作,因为隐式转换的功能和适用性无处不在。
然后,由于任何直接处理“ref”类的运算符(没有隐式转换为T&)将优先于T&上的运算符,您可以自由地实现这些希望实现的特殊奇怪语义运算符
从Boost库中查看Boost.Ref,Boost.Any和Boost.Variant等类。他们做类似的包装,但用途略有不同(也更有用)。