我正在编写一个对象分配器,我想通过以下方式调用它:
T result = factoryObject.construct(argA, argB, argC);
我目前有这个设计,有效......
class Factory {
void* memPool_;
template <typename Tret, typename... Args>
Tret construct(Args&&... args) {
Tret::methodA(std::forward<Args&&>(args));
Tret::Tret(memPool_, std::forward<Args&&>(args);
}
}
...只要我用以下方式调用它:
T result = factoryObject.construct<T>(argA, argB, argC);
我希望能够在不明确指定的情况下做到这一点
T
。 T
可能会变得非常复杂,我需要在初始化列表中内联使用这个工厂。我还需要在构造函数初始值设定项列表中使用它,因此我无法调用 auto result = factory.construct<T>()
(我只需要它根据其构造的内容推断返回类型)。
我尝试使用operator()技巧推断类型(根据https://stackoverflow.com/a/2613010/4649183):
public:
template <class T>
operator T() { return T(); }
};
class GC {
public:
static Allocator Allocate() { return Allocator(); }
};
int main() {
int p = GC::Allocate();
}
...但这不允许我传递参数(因为
operator()
不能接受参数)。我尝试将 Args&& args
作为元组存储为 Allocator
的成员,将元组重新打包到参数包中,并使用 Tuple to parameter pack 问题中提出的逻辑单独调用 operator(),但是
template <typename...Ts>
struct Constructor
{
Constructor(void* memPool, Ts... args) :
memPool{memPool},
args{std::forward<Ts>(args)...}
{}
template <typename T>
operator T() && {
return std::apply(
[this](auto&&... args) {
T::methodA(std::forward<Args&&>(args));
return T::T(memPool_, std::forward<Args&&>(args);
},
args);
}
void* memPool_;
std::tuple<Ts...> args;
};
class Factory {
void* memPool_;
template <typename... Args>
Constructor<Args&&...> construct(Args&&... args) {
return {memPool_, std::forward<Args>(args)...};
}
};