modelli c ++: combinazione di deduzioni con argomenti modello predefiniti

0

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
    
posta Lewis Pringle 17.08.2018 - 16:42
fonte

0 risposte

Leggi altre domande sui tag