Рассмотрим класс, который имитирует ассоциативный кеш:
template <size_t S, size_t L, size_t W>
class AssociativeCache {
size_t which_set(size_t index) { return index % (L * W); }
// ...
};
Здесь параметры кеша ключей S
, L
и W
являются параметрами нетипового шаблона времени компиляции.
Можно также реализовать подобный класс, подобный этому:
class AssociativeCacheDynamic {
size_t S, L, L;
size_t which_set(size_t index) { return index % (L * W); }
// ...
};
Здесь ключевые параметры такие же, как и в другом случае, но вместо этого сохраняются как переменные-члены класса.
За исключением конструктора, который устанавливает значения параметров кэша в динамическом случае, реализация каждого метода двух классов также по существу идентична, т. Е. Исходный код является побайтово-одинаковым 1 .
Если я хочу обоих этих классов, как я могу реализовать их с наименьшим дублированием кода и с как можно меньшим количеством неуклюжих макросов или несколькими включенными хаки?
Бонусуказывает, если решение позволяет иметь некоторые различия: например, метод шаблона может использовать std::array
хранилище, а динамический метод может использовать std::vector
.
1 Хотя скомпилированный код часто будет радикально отличаться (поскольку код не специализирован для фиксированных значений в динамическом случае).