【发布时间】:2016-06-10 12:27:48
【问题描述】:
我有很多代码以某种方式执行完全相同的操作(继承的代码),我希望在重新处理它的同时压缩代码而不丢失功能。例如让我们看看以下函数:
fnc(largetype & a, largetype & b) { f(A); f(B); };
fnc(largetype && a, largetype & b) { f(A); f(B); };
fnc(largetype & a, largetype && b) { f(A); f(B); };
fnc(largetype && a, largetype && b) { f(A); f(B); };
它们都在做完全相同的事情,但参数可以是右值或左值,而不会破坏函数逻辑。我想允许用户传递任何适合问题的东西,但我也不想一块一块地复制粘贴所有代码。我可以这样做:
fnc(largetype & a, largetype & b) { f(A); f(B); };
fnc(largetype && a, largetype & b) { fnc(a,b) };
fnc(largetype & a, largetype && b) { fnc(a,b) };
fnc(largetype && a, largetype && b) { fnc(a,b) };
这在技术上是正确的,尤其是内联,但对我来说似乎是错误的。有没有其他更好的方法来实现这样的效果?
唯一的要求是作为参数传递的类型可能/将在某种程度上大于默认内存块大小,因此避免复制至关重要。也有一个非零的机会参数可以更小但也可以是一个右值。线程安全是可选的。
我考虑过对这些函数进行模板化,但在我看来,这在某种程度上也是错误的方法。模板解决了不同接受类型的问题。在我的情况下,类型是相同的,只是以不同的方式传递。
【问题讨论】:
-
使用带有perfect forwarding的模板函数。
-
其实很完美...
标签: c++ parameter-passing c++14