Что ж, самый лучший способ сделать это в C ++ - это использовать функциональный объект для хранения запомненных значений. Я думаю, что это, вероятно, немного похоже на ваш декоратор Python, хотя я никогда не делал Python. Код будет выглядеть примерно так:
template <typename T, T (*calc)(T)>
class mem {
std::map<T,T> mem_map;
public:
T operator()(T input) {
typename std::map<T,T>::iterator it;
it = mem_map.find(input);
if (it != mem_map.end()) {
return it->second;
} else {
T output = calc(input);
mem_map[input] = output;
return output;
}
}
};
Код определяет класс шаблона, который принимает имя типа и указатель на функцию, затем в классе определяется оператор функции, позволяющий вызывать его. Оператор функции принимает входное значение, проверяет, присутствует ли указанное значение на карте, затем либо просто возвращает его с карты, либо вычисляет его (используя указатель функции), добавляет его на карту и затем возвращает.
Итак, если вы определили некоторую функцию обработки, например, скажем:
int unity(int in) { return in; }
Вы бы использовали код, подобный этому:
mem<int, unity> mem_unity;
int y;
y = mem_unity(10);
Итак, мы определяем экземпляр класса mem, который принимает наш тип значения и функцию обработки в качестве параметров шаблона, а затем просто вызываем этот класс как функцию.