使用参数包生成对象
Using a parameter pack to generate objects
我想创建一个可以根据命令实例化 class 的对象。我想这样做的原因是因为我必须创建一个对象的实例,它们都具有从文件中读取的相同初始参数,但我只想加载这些参数一次。
我的方案是用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
,然后稍后使用存储的参数包?
Is there a better way, by storing Args... data
somehow, and then using the stored parameter pack later on?
不确定是否更好,但您可以将参数存储在 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;
};
我想创建一个可以根据命令实例化 class 的对象。我想这样做的原因是因为我必须创建一个对象的实例,它们都具有从文件中读取的相同初始参数,但我只想加载这些参数一次。 我的方案是用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
,然后稍后使用存储的参数包?
Is there a better way, by storing
Args... data
somehow, and then using the stored parameter pack later on?
不确定是否更好,但您可以将参数存储在 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;
};