工厂级完美转发

时间:2018-02-04 17:02:19

标签: c++ templates factory perfect-forwarding

请考虑以下代码示例:

template<class T, class U>
struct b{
    b(T &&, U &&);
    //some useful stuff
};

template<class T>
struct factory{
    factory(T &&arg) : arg_(std::forward<T>(arg)){}

    template<class U>
    auto create(U &&u) const &{
        return b<const T &, U>(arg_, std::forward<U>(u));
    }
    template<class U>
    auto create(U &&u)  &&{
        return b<T, U>(std::forward<T>(arg_), std::forward<U>(u));
    }

    T arg_;
};

template<class T>
auto
make_factory(T &&t){
    return factory<T>(std::forward<T>(t));
}

我关注factory struct中的代码 - create方法最快,是最好的方式,使用工厂类完美转发?

  1. 我错过了什么或者这段代码是完美的&#39;在转发/移动数据方面?我想避免在任何可能的地方进行复制。

  2. 我应该在任何create方法中添加/删除const吗?

  3. 编辑:由于您的顾虑 - 我知道有时我会传递左值参考和专门化模板。这是理想的行为。当我在那里写的时候 - 我想避免复制任何东西,除非真的需要。因此,如果在其外部的范围内创建了对象,则工厂可以存储引用。我知道它不安全,但它仍然是一个设计选择。对于参考工厂创建的对象也应该存储引用。我希望这能澄清你的大部分问题。

1 个答案:

答案 0 :(得分:2)

我不知道你是否完全理解你在代码中做了什么。

template<class T>
auto
make_factory(T &&t){
    return factory<T>(std::forward<T>(t));
}

此代码尝试创建T的工厂。但是,如果您将左值传递给make_factory(),则会将T推断为参考。然后你将创建一个参考工厂。我认为这不太可能是你的目的。

此外,这一个

factory(T &&arg) : arg_(std::forward<T>(arg)){}

转发引用,因为T不是此函数中要推断的类型名称。