Как я могу написать оболочку ‘передавать ссылку по значению’ на C ?

#c

#c

Вопрос:

Я пишу компилятор для класса, и мы решили использовать java-подобную семантику для наших переменных. В принципе, операции чтения ведут себя как разыменования указателя, а записи ведут себя как присвоение указателя.

Итак, как я могу написать класс-оболочку, который имеет эту семантику? В принципе, каждый оператор, кроме присваивания, будет передан разыменованному значению.

РЕДАКТИРОВАТЬ: Это должен быть шаблонный класс, который обертывает переменную заданного типа. Вы присваиваете ей переменную, а затем используете оболочку вместо переменной. Цель состоит в том, чтобы оболочка, содержащая указатель на исходную переменную, имела ту же семантику, что и переменная java.

Важное уточнение: компилятор переводит наш язык на C , и этот класс будет использоваться в переведенном коде.

Комментарии:

1. Я отредактировал свой первоначальный вопрос с ответом.

2. Если вы все равно пишете компилятор самостоятельно, в чем именно проблема при реализации нужного вам стиля передачи аргументов?

3. Вы пытаетесь написать компилятор или пытаетесь заставить C работать как Java?

4. В общем, не очень хорошая идея переносить семантику и стили кодирования с других языков таким образом, такая семантика, если она не совсем понятна, вероятно, собьет с толку программистов, привыкших к «нормальному» C .

5. Вы пытаетесь получить повторно используемую ссылку на C ? Это сбило бы с толку большинство людей!

Ответ №1:

Прежде всего, я категорически против любых попыток превратить C в Java (что в основном и есть C #), и я особенно озадачен идеей отказа от семантики значений C , поскольку наиболее полезное использование RAII по существу требует семантики значений, это не то, от чего я когда-либо хотел бы отказаться. Но, ради аргументации, давайте посмотрим, что можно сделать.

Теперь вы должны понимать, что ссылочная семантика практически требует некоторой формы сборки мусора. Вы могли бы реализовать это без, но это было бы очень хрупким и / или протекало бы повсюду. Простой способ сделать это на C — использовать интеллектуальный указатель с подсчетом ссылок, т.е. boost::shared_ptr или std:: tr1:: shared_ptr (они одинаковы).

Самый простой способ перенести все операторы содержащегося типа в ваш тип «ref» — это просто обеспечить неявное преобразование в содержащийся тип. Таким образом, если вызывается какой-либо оператор, компилятор неявно разыменует указатель и использует базовый оператор. Вероятно, вам все равно пришлось бы предоставить какую-либо функцию get (), чтобы сделать это явно, потому что возможности и применимость неявных преобразований работают не везде.

Тогда, поскольку любой оператор, который работает с классом «ref» напрямую (без неявного преобразования в T amp;), будет иметь приоритет над операторами в T amp;, вы можете свободно реализовать эти специальные операторы странной семантики, которые вы хотите реализовать.

Взгляните на такие классы, как Boost.Ссылка, повышение.Any и Boost.Variant, из библиотек Boost. Они делают похожие оболочки, но для немного других (и более полезных) целей.

Комментарии:

1. Мы не пытаемся превратить C в Java. Мы пытаемся завершить срочный проект, а именно компилятор, который переводит на C . Переменные в разработанном нами языке имеют ту же семантику, что и переменные в java, и мне было поручено написать класс-оболочку, который будет содержать переменный class, который будет использовать выводимый код C .