c++ - 用 C++11 编写通用内存函数

标签 c++ c++11 memoization

正在寻找一种方法来实现一个通用的通用内存函数,该函数将接受一个函数并返回该函数的内存版本?

在 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/

相关文章:

javascript - Node 类中的Memoizee实例方法

c++ - 通过引用传递 vector 的尾递归

c++ - 动态数组到两个函数

c++ - 正在初始化类型为 "int &"的引用(不是 const 限定的),其值是 "bool"类型的一些 hack?

memoization - "memoize"一词意味着什么?

python - 需要内存函数才能像函数一样嘎嘎叫

c++ - 无法在编辑控件上设置字体

c++ - 隐藏成员函数模板 - 哪个编译器是正确的?

c++ - 为什么 std::unique_ptr 不隐式转换为 T* 和 const T*?

c++ - 浮点类型模板函数中的文字