使用可变参数模板延迟make_unique

拉兹沃德

我需要一个可用作延迟工厂的类,保存参数以创建另一个类,并稍后调用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::make_unique

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&...);

Args像您一样指定时,std::make_unique可能只接受右值。但是,std::bind将其绑定参数作为左值传递,这就是为什么会出现错误的原因。

代替std::bind,使用lambdas代替

template<typename...>
struct pack {};

template<typename T, typename Tup, typename... TArgs, std::size_t... Is>
std::unique_ptr<T> helper(Tup&& tup, pack<TArgs...>, std::index_sequence<Is...>)
{
    return std::make_unique<T>(static_cast<TArgs>(std::get<Is>(tup))...);
}

template <typename T>
class ConstructLater
{
public:
    template<typename... Args>
    ConstructLater(Args&&... args)
        : factory{[tup = std::make_tuple(std::forward<Args>(args)...)]() mutable {
            return helper<T>(std::move(tup), pack<Args&&...>{}, std::index_sequence_for<Args...>{});
        }}
    {
    }

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

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

请注意,也不ConstructLater应以此为模板Args,它违背了的整个目的std::function无论哪种方式,都需要对构造函数本身进行模板化,以完美转发其参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用可变参数模板扩展

来自分类Dev

如何使用可变参数模板构建开关柜

来自分类Dev

使用可变参数模板参数解析lambda签名

来自分类Dev

如何使用可变参数模板展平类型树?

来自分类Dev

可变参数模板类的可变参数模板

来自分类Dev

尝试使用可变参数模板定义类型

来自分类Dev

在C ++中使用可变参数模板迭代参数包

来自分类Dev

使用专门的可变参数模板类的声明

来自分类Dev

可变参数模板提取

来自分类Dev

使用可变参数模板的工厂模式?

来自分类Dev

使用可变参数模板创建哈希队列

来自分类Dev

C ++使用可变参数模板绑定成员函数

来自分类Dev

在可变参数模板中使用std :: placeholders

来自分类Dev

可变参数模板示例

来自分类Dev

clang不使用可变参数推断可变参数模板函数中的模板参数

来自分类Dev

使用可变参数模板参数提高变体访客

来自分类Dev

使用可变参数模板将指针传递给成员

来自分类Dev

如何使用可变参数模板转换每种变体类型

来自分类Dev

С++可变参数模板:实现可变参数

来自分类Dev

使用可变参数模板打印列表

来自分类Dev

可变参数模板类的可变参数模板

来自分类Dev

使用专门的可变参数模板类的声明

来自分类Dev

可变参数模板对

来自分类Dev

在可变参数模板中使用对

来自分类Dev

可变参数模板示例

来自分类Dev

可变参数模板的论点

来自分类Dev

c ++ 03:使用boost的可变参数模板

来自分类Dev

使用成员函数调用可变参数模板函数

来自分类Dev

使用可变参数模板的平方和