正在寻找一种方法来实现一个通用的通用内存函数,该函数将接受一个函数并返回该函数的内存版本?
在 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++ 中表达通用和可重用的装饰器,可能使用 C++11 的新特性?
最佳答案
返回 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
首先留给读者作为练习。
关于c++ - 用 C++11 编写通用内存函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17805969/