下面代碼中的註釋行不會編譯,因爲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