寻找一种实现通用通用备忘录功能的方法,该方法将接受一个函数并返回其相同的备忘录版本?

在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中,这是读者的一项练习。

09-10 00:06
查看更多