下面代码中的注释行不会编译,因为F
类型不符合专业化。有人能解释为什么吗?成员函数指针作为模板参数的问题
#include <memory>
#include <functional>
#include <map>
#include <tuple>
template <typename R, typename T, typename... Args>
std::function<R(Args...)> memoizeMemberFunction (R T::*f(Args...), const T* t) {
auto cache = std::make_shared<std::map<std::tuple<const T*, Args...>, R>>();
return ([f, cache](T* t, Args... args) {
const std::tuple<const T*, Args...> tuple(t, args...);
if (cache->find(tuple) == cache->end())
(*cache)[tuple] = (t->*f)(args...); // Insert 'tuple' as a new key in the map *cache.
return (*cache)[tuple];
});
}
template <typename Class, typename Fptr, Fptr> struct MemberFunctionMemoizer;
template <typename Class, typename R, typename... Args, R Class::*F(Args...)>
struct MemberFunctionMemoizer<Class, R (Class::*)(Args...) const, F> {
static std::function<R(Class*, Args...)>& get (const Class* p) {
static std::function<R (Args...)> memoizedF (memoizeMemberFunction(F, p));
return memoizedF;
}
};
struct FibonacciCalculator {
unsigned long calculate(unsigned num) const {
using F = MemberFunctionMemoizer<FibonacciCalculator,
unsigned long (FibonacciCalculator::*)(unsigned) const, &FibonacciCalculator::calculate>;
// return (num < 2) ? num : F::get(this)(num - 1) + F::get(this)(num - 2);
// Won't compile because F does not meet the specialization.
}
};
#include <iostream>
int main() {
FibonacciCalculator fib;
std::cout << fib.calculate(10) << '\n';
}
我在这里错过了什么吗?如何获得F
以满足专业化?我试图从图片中删除const修饰符,但同样的问题仍然存在。
我也想维护使用成员函数指针作为模板参数的设计,即使通过使用非成员函数指针有解决此特定问题的方法。
常量性。成员函数指针模板参数不是const限定的。另外,我认为'R Class :: * F(Args ...)'不是指向成员函数的指针。 – dyp
我试着调整const,包括使'calculate()'非const,并且仍然得到相同的问题。如何解决这个问题? – prestokeys
我觉得'R Class :: * F(Args ...)'是一个函数,它返回一个指向成员的指针,即'auto F(Args ...) - > R Class :: *'。 OTOH,'R(Class :: * F)(Args ...)'是一个指向成员函数的指针,可以是const限定的。 – dyp