【问题标题】:Using a parameter pack to generate objects使用参数包生成对象
【发布时间】:2021-07-01 19:25:06
【问题描述】:

我希望创建一个可以根据命令实例化类的对象。我之所以要这样做,是因为我必须创建一个对象的实例,它们都具有从文件中读取的相同初始参数,但我只想加载这些参数一次。 我的解决方案是使用 lambdas,但感觉很脏:

#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,然后稍后使用存储的参数包?

【问题讨论】:

  • @NathanOliver,我相信ObjectGenerator 已经是一个模板了...
  • @r3musn0x 哦,是的。我虽然 OP 是在创建一个概念,但并不是说它是对参数的约束。仍然需要适应概念和约束。至少现在我可以添加一个答案:)

标签: c++ variadic-templates parameter-pack


【解决方案1】:

有没有更好的方法,以某种方式存储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;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2023-02-25
    • 2020-07-18
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多