重构所有类共有的方法

Olu*_*ide 2 c++ refactoring templates member-functions

我有一个全局函数将一个对象(或类型Source)的相关位复制到另一个(类型Target),如下所示:

template<typename Source , typename Target>
void partialCopy( Source& source , Target& target )
{
    // perform copy
}
Run Code Online (Sandbox Code Playgroud)

我发现全局函数的问题在于,与成员函数不同,编码两个参数中的哪一个是源,哪个是目标时,不能立即清楚.因此,我想partialCopy()每个类中都有一个成员函数,如下所示:

struct Foo
{
    template<typename T>
    void partialCopy( T& target )
    {
        ::partialCopy( *this , target );
    }
};
Run Code Online (Sandbox Code Playgroud)

现在的问题是必须将成员函数复制到几十个类.这是一个可以容忍的复制和粘贴编程案例吗?我已经考虑过放入partialCopy一个头文件partialCopy.h并使用预处理器include将它'注入'到每个类中,如下所示:

struct Foo
{
    #include "partialCopy.h"
};


Foo f;
Bar b;
f.partialCopy( b );
Run Code Online (Sandbox Code Playgroud)

虽然这是有效的,但我从未在任何地方看到它,也不知道它是否不可接受.

我已经尝试将partialCopy成员函数放在公共基类中并继承它但这不起作用,因为this关键字将引用基类而不是派生类.

还有更好的选择吗?请指教.

编辑

static_cast在一个CRTP基类中对派生类执行a的John的建议(在一个被删除的线程中)可以很好地工作.@John请发一个答案,我会这样标记.

Bar*_*icz 5

我发布这个作为答案,因为在我看来这是合适的.不过Henrik首先评论道.(但是,这也是我的第一个想法:))

常量引用

const&对源参数使用(const-reference).这样,它很容易与目标区分开来.

额外的好处是它将验证并确保部分复制功能的正确性.

右值引用

你也可以考虑重载它Source&&.如果有一些直接复制的缓冲区,您的函数可能会使用它.