我正在尝试编写一个函数对象存储器,以节省重复昂贵的函数调用所需的时间。在我的类设计中,我正在努力寻找一个简单的接口。
使用这个函数对象基类:
template <typename TOut, typename TIn>
class Functor {
public:
virtual
~Functor() {
}
virtual
TOut operator()(TIn input) = 0;
};
我现在想编写一个类,用于封装和记忆一个函数对象。除了封装一个 Functor
,MemoizedFunctor
本身也将是一个 Functor
。因此,需要有 3 个模板参数。
下面是一个可行的示例:
#include <unordered_map>
template <typename F, typename TOut, typename TIn>
class MemoizedFunctor : public Functor<TOut, TIn> {
public:
MemoizedFunctor(F f) : f_(f) {
}
virtual
~MemoizedFunctor() {
}
virtual
TOut operator()(TIn input) override {
if (cache_.count(input)) {
return cache_.at(input);
} else {
TOut output = f_(input);
cache_.insert({input, output});
return output;
}
}
private:
F f_;
std::unordered_map<TIn, TOut> cache_;
};
class YEqualsX : public Functor<double, double> {
public:
virtual
~YEqualsX() {
}
double operator()(double x) override {
return x;
}
};
int main() {
MemoizedFunctor<YEqualsX, double, double> f((YEqualsX())); // MVP
f(0); // First call
f(0); // Cached call
return 0;
}
我觉得一定有一种方法可以消除指定所有3个模板参数的必要性。考虑到传递给MemoizedFunctor
构造函数的函数,我认为这三个模板参数都可以被推断出来。
我不确定如何重写这个类,以便使用它不需要所有的模板规范。
我尝试在MemoizedFunctor
中使用一个智能指针作为成员变量。这消除了第一个模板参数,但现在类的使用者必须将一个智能指针传递给MemoizedFunctor
类。
总之,我希望在构造时自动推导出MemoizedFunctor
的所有模板参数。我相信这是可能的,因为在构造时所有模板参数都是明确的。