В настоящее время, когда ваш объект кеша создается, вы передаете соответствующие аргументы.Это означает, что вам нужно знать, какими должны быть аргументы для его конструктора при создании объектов.C ++ инициализирует объекты со статическим временем жизни в 2 этапа:
Статическая инициализация (приблизительно: константы, известные во время компиляции, например, int var= 42;
в области имен)
Динамическая инициализация (приблизительно: некоторый код должен быть запущен для их инициализации, например, int var2 = foo()
в области пространства имен)
В сущности, это означает, что вы должны выполнить одно из следующих действий:Несколько вещей:
Создайте ( или инициализируйте ) объект в более позднее время.
Это подход, который я бы порекомендовал вам.На самом деле это два разных решения, одно с указателями, а другое с поздней инициализацией уже созданного объекта, но оба имеют одну и ту же идею, поэтому я объединю их в одну группу.Я исследую только вариант указателя, другой должен быть легким для подражания.
Что бы это значило, это объявить lru_cache
как указатель, а не по значению.Позже вы будете динамически создавать объект всякий раз, когда вы загрузите необходимые данные.
Решение Pointer будет выглядеть примерно так:
size_t load_parameter() {
//do magic;
return 42;
}
std::unique_ptr<lru_cache<int, float>> states_action0 = nullptr;
int main()
{
size_t STATES_NO_LRU = load_parameter();
states_action0 = std::make_unique<lru_cache<int, float>>(STATES_NO_LRU);
}
Решение поздней инициализации будет по умолчанию создавать объект lru_cache
и реализовывать метод lru_cache::initialize(size_t maxSize)
для инициализации объекта.
Создание фабричной функции, которая будет инициализировать создание объекта.
- Если мы не вызвали
load_paramter()
, вызовите его и сохраните результаты в локальной статической форме. - Создайте
lru_cache
объект с использованием локальной статики и верните его.
Я бы настоятельно рекомендовал против такого решения.Время, в которое произойдет ваша загрузка, определяется реализацией и, скорее всего, произойдет до вызова main.Это будет выглядеть примерно так:
size_t load_parameter() {
//do magic;
return 42;
}
lru_cache<int, float> cacheMaker()
{
static size_t STATES_NO_LRU = -1;
if (STATES_NO_LRU == -1)
{
STATES_NO_LRU = load_parameter();
}
return lru_cache<int, float>(STATES_NO_LRU);
}
lru_cache<int, float> states_action0 = cacheMaker();
int main()
{
}