通过引用传递的函数接受带有operator()的类的引用

时间:2012-09-06 01:23:47

标签: c++ pass-by-reference

所以,我越是想到它的合法性似乎。当我将我的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";
}

我的意思是,不要误会我的意思:我很高兴它有效,它似乎有点“神奇”。提前谢谢。

1 个答案:

答案 0 :(得分:2)

你在欺骗自己。 fib_memo_memo不是f成员变量包含fib_memo的记事者。您的初始化程序实际上使用了隐式复制构造函数,因此fib_memo_memo只是fib_memo的副本。您可以通过添加

来自行验证
memoizer(const memoizer &m) = delete;

你会开始收到像

这样的错误
error: call to deleted constructor of 'memoizer<int, int>'
    memoizer<int,int> fib_memo_memo( fib_memo );