Ho una classe semplice ( dettagli qui )
namespace MemoizerSupport {
template <typename T1, typename T2>
using DEFAULT_CACHE = LRUCache<T1, T2>;
}
template <typename RESULT, template <typename, typename> class CACHE = MemoizerSupport::DEFAULT_CACHE, typename... ARGS>
struct Memoizer {
Memoizer (const function<RESULT (ARGS...)>& f, CACHE<tuple<ARGS...>, RESULT>&& cache = CACHE<tuple<ARGS...>, RESULT>{});
nonvirtual RESULT Compute (ARGS... args);
private:
function<RESULT (ARGS...)> fFunction_;
CACHE<tuple<ARGS...>, RESULT> fCache_;
};
utilizzabile come segue:
unsigned int totalCallsCount{};
Memoizer<int, MemoizerSupport::DEFAULT_CACHE, int, int> memoizer{
[&totalCallsCount](int a, int b) { totalCallsCount++; return a + b; }
};
VerifyTestResult (memoizer.Compute (1, 1) == 2 and totalCallsCount == 1);
VerifyTestResult (memoizer.Compute (1, 1) == 2 and totalCallsCount == 1);
Il mio problema è che voglio essere in grado di avere l'oggetto 'cache predefinita' DEFAULT e di dedurre gli altri parametri:
// doesn't work
Memoizer memoizer{[&totalCallsCount](int a, int b) { totalCallsCount++; return a + b; }};
So che posso sostituire la definizione dell'argomento per il modello Memoizer con un 'typename FUNCTION' per consentire qualsiasi cosa che corrisponda, ma quindi non ho i tipi dedotti di cui ho bisogno per la cache.
E mi piacerebbe poter mettere l'argomento DEFAULT_CACHE alla fine del nome del nome del tipo (nel modello Memoizer), ma poi Non riesco a far variare il modello nel numero di argomenti del memoizer?
Questo è qualcosa che i modelli C ++ non supportano ancora, o c'è qualche suggerimento / pattern che qualcuno può offrire per rendere questo lavoro un po 'più fluido?
Thanks,
Lewis