Использование пакета параметров для создания объектов

avatar
Lala5th
1 июля 2021 в 19:25
97
1
0

Я хочу создать объект, который может создавать экземпляр класса по команде. Причина, по которой я хочу сделать это именно так, заключается в том, что мне нужно создать экземпляры объекта, все из которых имеют одни и те же начальные параметры, считанные из файла, но я хочу загрузить эти параметры только один раз. Мое решение использует лямбда-выражения, но оно кажется очень грязным:

#include <functional>

template <class GENERATED_TYPE, class... Args> requires requires(Args... data) {
    { new GENERATED_TYPE(data...) } -> std::same_as<GENERATED_TYPE*>;
}
class ObjectGenerator {
    public:
        ObjectGenerator(Args... data){ instance_generator = [data...](){ return new GENERATED_TYPE(data...); }; }
        ~ObjectGenerator(){}
        GENERATED_TYPE* getInstance() { return instance_generator(); }
    private:
        std::function<GENERATED_TYPE*()> instance_generator;
};

Есть ли лучший способ, каким-то образом сохранив Args... data, а затем используя сохраненный пакет параметров позже?

Источник
r3mus n0x
1 июля 2021 в 19:33
0

@NathanOliver, я считаю, что ObjectGenerator уже является шаблоном...

NathanOliver
1 июля 2021 в 19:38
0

@ r3musn0x О да. Я думал, что ОП создавал концепцию, а не ограничения на параметры. Все еще нужно приспособиться к концепциям и ограничениям. По крайней мере, теперь я могу добавить ответ :)

Ответы (1)

avatar
NathanOliver
1 июля 2021 в 19:42
2

Есть ли лучший способ, каким-то образом сохранить Args... data, а затем использовать сохраненный пакет параметров позже?

Не уверен, что лучше, но вы можете хранить аргументы в std::tuple и затем использовать std::make_from_tuple для создания объекта каждый раз. Это будет выглядеть как

#include <functional>
#include <tuple>

template <class GENERATED_TYPE, class... Args> requires requires(Args... data) {
    { new GENERATED_TYPE(data...) } -> std::same_as<GENERATED_TYPE*>;
}
class ObjectGenerator {
    public:
        ObjectGenerator(Args... data) : arguments(std::move(data)...) {}
        
        GENERATED_TYPE getInstance() { 
            return std::make_from_tuple<GENERATED_TYPE>(arguments); 
        }
    private:
        std::tuple<Args...> arguments;
};