【发布时间】:2019-05-23 19:09:23
【问题描述】:
我正在尝试编写一个仿函数记忆器来节省重复昂贵的函数调用的时间。在我的课堂设计中,我很难找到一个简单的界面。
使用这个 Functor 基类:
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 的构造函数的函数,我认为可以推导出所有三个模板参数。
我不确定如何重写该类,以便使用它不需要所有模板规范。
我尝试使用指向 Functor 的智能指针作为 MemoizedFunctor 中的成员变量。这消除了第一个模板参数,但现在该类的用户必须将智能指针传递给MemoizedFunctor 类。
总之,我想让MemoizedFunctor 的所有模板参数在构造时自动推导出来。我相信这是可能的,因为在构造时所有模板参数都是明确的。
【问题讨论】:
-
您正在翻转输入/输出参数 - 您能选择一致的顺序吗?
-
@Barry 对此感到抱歉,希望现在已修复。从一台机器转移到这台机器时出错。
标签: c++ templates c++17 sfinae template-argument-deduction