gpt4 book ai didi

c++ - 使用可变参数模板延迟 make_unique

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:07 24 4
gpt4 key购买 nike

我需要一个类作为延迟工厂工作,保存参数以创建另一个类并稍后及时调用 make_unique。到目前为止,我没有任何运气让可变模板版本工作。任何帮助将不胜感激(下面的最小非工作版本)。

template <typename T, typename ... Args>
class ConstructLater
{
public:
ConstructLater(Args &&... args)
{
factory = std::bind(std::make_unique<T, Args...>, std::forward<Args>(args)...);
}

std::unique_ptr<T> Later()
{
return factory();
}

private:
std::function<std::unique_ptr<T>(void)> factory;
};

class Foo { public: Foo(int) { } };

int f()
{
// None of these work
ConstructLater<Foo>(3);
ConstructLater<Foo, int>(6);
}

编辑:澄清一下,我不需要使用 std::bind,事实上我希望类按值存储参数的拷贝以避免临时对象出现问题。还将标签更新为 C++14。

最佳答案

如果您同意复制每个参数,那么您可以跳过 std::bindstd::make_unique:

template <typename T, typename ... Args>
class ConstructLater
{
public:
ConstructLater(Args... args) : _storedArgs(args...)
{
}

std::unique_ptr<T> later()
{
return laterHelper(std::make_index_sequence<sizeof...(Args)>{});
}

private:
template<std::size_t... I>
std::unique_ptr<T> laterHelper(std::index_sequence<I...>)
{
return std::unique_ptr<T>(new T(std::get<I>(_storedArgs)...));
}

std::tuple<Args...> _storedArgs;
};

class Foo { public: Foo(int) { } };

int f()
{
ConstructLater<Foo, int> cl(6);

auto foo = cl.later();
}

这在 C++14 中编译得很好:https://godbolt.org/z/owgoXc

关于c++ - 使用可变参数模板延迟 make_unique,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55381966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com