通过返回类型的模板推导将参数包传递给函数

问题描述 投票:0回答:1

我正在编写一个对象分配器,我想通过以下方式调用它:

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(),但是

    据我所知,这实际上无法存储对参数的引用(这是有道理的,因为编译器不知道我不会让原始参数超出范围)
  1. 最终的解决方案是如此复杂,我一定是走错了路。
我能做什么?

c++ parameter-passing variadic-functions rvalue-reference
1个回答
0
投票
你应该拥有所有的碎片。代码应类似于:

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)...}; } };
    
© www.soinside.com 2019 - 2024. All rights reserved.