请考虑以下代码示例:
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
方法最快,是最好的方式,使用工厂类完美转发?
我错过了什么或者这段代码是完美的&#39;在转发/移动数据方面?我想避免在任何可能的地方进行复制。
我应该在任何create
方法中添加/删除const吗?
编辑:由于您的顾虑 - 我知道有时我会传递左值参考和专门化模板。这是理想的行为。当我在那里写的时候 - 我想避免复制任何东西,除非真的需要。因此,如果在其外部的范围内创建了对象,则工厂可以存储引用。我知道它不安全,但它仍然是一个设计选择。对于参考工厂创建的对象也应该存储引用。我希望这能澄清你的大部分问题。
答案 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
不是此函数中要推断的类型名称。