寻找一种实现通用通用备忘录功能的方法,该方法将接受一个函数并返回其相同的备忘录版本?
在python中寻找类似@memo(来自Norving的站点)的装饰器。
def memo(f):
table = {}
def fmemo(*args):
if args not in table:
table[args] = f(*args)
return table[args]
fmemo.memo = table
return fmemo
更笼统地说,是否有可能使用C++ 11的新功能来表达C++中通用且可重用的装饰器?
最佳答案
紧凑型返回lambda:
template <typename R, typename... Args>
std::function<R (Args...)> memo(R (*fn)(Args...)) {
std::map<std::tuple<Args...>, R> table;
return [fn, table](Args... args) mutable -> R {
auto argt = std::make_tuple(args...);
auto memoized = table.find(argt);
if(memoized == table.end()) {
auto result = fn(args...);
table[argt] = result;
return result;
} else {
return memoized->second;
}
};
}
在C++ 14中,可以使用广义的返回类型推导来避免返回
std::function
造成的额外间接访问。使其完全通用,允许传递任意函数对象而无需先将它们包装在
std::function
中,这是读者的一项练习。