Dom*_*nic 6 c++ templates c++11
我正在使用具有许多重载的给定函数的文件,如下所示:
inline X f(ScriptWrappable* impl, Y y, Z z) { ... }
inline X f(Node* impl, Y y, Z z) { ... }
inline X f(RawPtr<T> impl, Y y, Z z) { ... }
inline X f(const RefPtr<T>& impl, Y y, Z z) { ... }
inline X f(ScriptWrappable* impl, Y y, Z z) { ... }
inline X f(const String& impl, Y y, Z z) { ... }
inline X f(int64_t impl, Y y, Z z) { ... }
template<typename T, size_t capacity> inline X f(const Vector<T, capacity>& impl, Y y, Z z) { ... }
Run Code Online (Sandbox Code Playgroud)
我试图添加一个只需要一个参数的新重载,如下所示:
template<typename T> inline X f(T impl, W w) {
return f(impl, w->getY(), w->getZ());
}
Run Code Online (Sandbox Code Playgroud)
我正在使用模板,以便所有上述变体自动适用于我的新双参数版本.
但是,在代码审查期间,我被问到" T&&
避免复制会更好吗?".也就是说,我应该这样做
template<typename T> inline X f(T&& impl, W w) {
return f(impl, w->getY(), w->getZ());
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道这个问题的答案.我以为我理解了普遍的参考,但我不熟悉他们什么时候是个好主意.在我选择一个而不是另一个的情况下会有什么后果?
如果我不得不猜测,我会说,因为T可以代表的原始类型都很容易复制(原语,引用或指针),T &&不会带来太多好处.但我仍然很好奇,例如,任何类型都可以传递给无法传递给T版本的T &&版本,反之亦然.
你应该写这样的函数:
template<typename T> inline X f(T&& impl, W w) {
return f(std::forward<T>(impl), w->getY(), w->getZ());
}
Run Code Online (Sandbox Code Playgroud)
这称为完美转发.类型impl
将与您f
直接调用的完全相同.它会不会不一定是R值的参考.