所以,我想得越多,它的合法性就越奇怪。当我将 memoizer 仿函数的一个实例传递给它的构造函数时,编译器不会抱怨。在 memoizer 模板中应该如何读取“f”?似乎使用相同的类型声明OutputT (&f) InputT
,它可以通过引用来引用函数,或者——我认为这是非法的——对成员函数的引用,即operator()
类的实例memoizer<int,int>
。是否应该将 f 解读为“对已operator()
定义事物的引用”?
#include <map>
#include <iostream>
template<typename OutputT, typename InputT>
class memoizer
{
private:
OutputT (&f) (InputT);
std::map<InputT,OutputT> dat;
public:
memoizer( OutputT (&f) ( InputT ) ) : f(f) { }
OutputT operator()( InputT t )
{
if( dat.count(t)==0 )
dat[t] = f(t);
return dat[t];
}
};
int fib( int n )
{
if( n < 2 ) return 1;
return fib( n-2 ) + fib( n-1 );
}
int main()
{
memoizer<int,int> fib_memo( fib );
memoizer<int,int> fib_memo_memo( fib_memo );
std::cout << fib( 12 ) << "\n";
std::cout << fib_memo( 12 ) << "\n";
std::cout << fib_memo_memo( 12 ) << "\n";
}
我的意思是,不要误会我的意思:我很高兴它有效,只是看起来有点“神奇”。提前致谢。