И в Python, и в Ruby целые числа являются объектами. Так что вопрос не в том, что «значение» является целым числом или строкой, это может быть что угодно. Кроме того, все на обоих этих языках является сборщиком мусора. Нет необходимости в копировании объектов, указатели могут использоваться внутри, если они безопасно хранятся где-то, где сборщик мусора их увидит.
Итак, одним из решений вашей проблемы будет:
class myInterpreterValue {
virtual ~myInterpreterValue() {}
// example of a possible member function
virtual string toString() const = 0;
};
class myInterpreterStringValue : public myInterpreterValue {
string value;
virtual string toString() const { return value; }
};
class myInterpreterIntValue : public myInterpreterValue {
int value;
virtual string toString() const {
char buf[12]; // yeah, int might be more than 32 bits. Whatever.
sprintf(buf, "%d", value);
return buf;
}
};
Затем используйте виртуальные вызовы и dynamic_cast
для включения или проверки типов вместо сравнения со значениями myInterpreterType.
Обычно в этот момент нужно беспокоиться о том, что вызовы виртуальных функций и динамическое приведение могут быть медленными. Как в Ruby, так и в Python повсеместно используются вызовы виртуальных функций. Хотя это и не виртуальные вызовы C ++: для обоих языков их «стандартная» реализация на C с пользовательскими механизмами полиморфизма. Но в принципе нет оснований предполагать, что «виртуальный» означает «производительность из окна».
Тем не менее, я ожидаю, что они, вероятно, имеют некоторые умные оптимизации для определенных видов использования целых чисел, в том числе в качестве счетчиков циклов. Но если вы сейчас видите, что большую часть своего времени вы тратите на копирование пустых строк, то виртуальные вызовы функций по сравнению почти мгновенны.
Реальное беспокойство вызывает то, как вы собираетесь управлять ресурсами - в зависимости от того, какие у вас планы относительно вашего интерпретируемого языка, сборка мусора может доставить больше проблем, чем вы хотите.