通过引用传递的函数接受对具有运算符()的类的引用
Function passing by reference accepts reference to class with operator()
所以,我越想这件事,它的合法性就越奇怪。当我将记忆器函子的一个实例传递给它的构造函数时,编译器不会抱怨。应该如何在备忘录模板中读取"f"?似乎使用相同的类型声明OutputT (&f) InputT
,它可以通过引用引用函数,或者——我认为这是非法的——引用成员函数,即类memoizer<int,int>
实例的operator()
。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";
}
我的意思是,不要误解我的意思:我很高兴它能起作用,只是看起来有点"神奇"提前谢谢。
你在欺骗自己。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 );
相关文章:
- 取消引用运算符不能重载
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 为什么在函数名称中使用取消引用" * "运算符?
- C++:类类型引用运算符=用法
- 为什么通过通用引用运算符 (&&) 将变量的引用传递给 Varadic 模板函数失败?
- 当取消引用运算符 (*) 重载时,*this 的使用是否受到影响?
- 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
- 赋值不起作用,但带有取消引用运算符的地址起作用?
- 关于解引用运算符是否在表达式中产生对象对值的定义不明确
- 如何重载箭头取消引用运算符->() 不是针对实体对象,而是针对指针
- (取消)引用运算符的评估
- 重载取消引用运算符(运算符*())
- 如何重载取消引用运算符
- 结构引用和取消引用运算符
- 输入迭代器必须具有常量解引用运算符吗
- 对 std::atomic::load 的结果使用结构取消引用 (->) 运算符是否安全
- C++使用引用运算符传递数组
- 使用引用和取消引用运算符读取代码行时遇到问题
- 在C++向量中使用解引用运算符
- 是否可以根据基于的范围类型调用不同的取消引用运算符重载