c++ - 为什么模板参数推导/替换在这里失败?

标签 c++ templates memoization

我正在尝试编写一个简单的模板,我可以将其用于带有单个参数的函数的内存:

#include <map>          

template <typename F,typename OUT,typename IN> 
OUT memoization(IN in){
    static std::map<IN,OUT> memo;
    static typename std::map<IN,OUT>::iterator found = memo.find(in);
    if (found != memo.end()) { return found->second; }  
    OUT res = F(in);
    memo(in) = res;
    return res;
}

double test(double x) { return x*x; }

int main(){
    for (int i=0;i<5;i++){
        memoization<test,double,double>(i*0.5);
    }
}

但是我得到了错误:

error: no matching function for call to 'memoization(double)'

note: candidate is:

note: template OUT memoization(IN)

note: template argument deduction/substitution failed:

为什么编译失败?

实际上,当我指定所有模板参数时,我根本不明白为什么会发生模板参数推导/替换。

我使用的是 gcc 4.7.2 版(未启用 C++11)

PS:模板中的错误比我最初意识到的要多得多,但我保留原样...

最佳答案

您的函数模板采用三个类型 参数:

template <typename F,typename OUT,typename IN> 
OUT memoization(IN in) { ... }

您传递的是 test对于 F . test不是类型,是值。此外,表达式 F(in)出于同样的原因,在您的功能模板中是错误的。


总的来说,这种方法有很大的缺陷,因为它看起来与实际情况相去甚远。也就是说,它是被内存的函数,而不是一个值。在编译时要求函数值也是非常有限的。

更好的方法是将记忆化视为装饰器。即:

template <class F>
Memoized<F> memoize(F f) {
    return {f};
}

这样:

auto memo_test = memoize(test);
memo_test(0); // performs computation
memo_test(0); // doesn't perform computation
memo_test(0); // ditto

我离开了 Memoized<T> 的实现作为练习。

关于c++ - 为什么模板参数推导/替换在这里失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39573289/

相关文章:

c++ - 如何将多维数组传递给 C 和 C++ 中的函数

c++ - 寻找一种更好的方法来表示无符号字符数组

haskell - 某处是否有基于对象标识的线程安全内存库?

r - R 中的阶乘内存

algorithm - 为什么记忆化不能提高归并排序的运行时间?

c++ - 从远程 MySQL 服务器本地导出 .csv 数据

c++ - 下面的语句如何评价?

php - 使用 javascript/jquery 选择用户已检查的所有收件箱消息

c++ - 在头文件中包含 std::vector 会导致模板实例化错误

c++ - 为什么 is_constructible 声称某些东西不是可构造的?