使用宏来覆盖移动函数的接口的缺点
Disadvantage of using macro to cover interface of move-like function
使用宏作为所有移动语义的接口的缺点是什么?
我最近在类(http://stackoverflow.com/a/4782927/(中阅读了有关移动相关函数的语法,我认为,它非常乏味和重复: -
C(C&&) = default; // Move constructor
C& operator=(C&&) & = default; // Move assignment operator
,如果我想自定义具有相同实现的移动和构造人,那就更脏了。(与复制构造函数相同的问题,= C 中的运算符过载:一个常见的函数吗?(
因此,我决定创建一个宏观(掉期函数(,以使所有内容都在一个地方简洁。
#define MACRO_MOVE(C)
C& operator=(C&& that) & {
moveHack(this,&that); return *this;
}
C(C&& that){
moveHack(this,&that);
}
static void moveHack(C* dst,C* src)
这是用法: -
class X{
int data=42;
MACRO_MOVE(X){
dst->data=src->data;
src->data=0;
}
};
但是,我以前没看过有人喜欢这样。
我应该关注什么问题吗?
这种方法是否有具体的缺点?
零的规则是,只有管理资源(如内存(的类需要明确的移动/复制分配/施工方法。
您可以将几乎每种类型的存储都纳入自我管理资源中。这些资源类型往往是几种不同的变体之一(价值指针,独特的指针,共享指针等(。
通常,在移动分配时,您还需要清理现有状态。移动构造时,事实并非如此。两个实现 can 共享一些代码,但通常您不希望它们。
为一些简单的资源管理类型做这种宏观黑客是一个坏主意。在整个地方拥有复杂的资源管理类型是一个坏主意。这个宏观黑客的行动并不是从根本上讲的操作。通常,只有在宏的昂贵时才能使用宏。
。您的宏没有增加实用程序。它所做的看起来容易出现虫子和危险。如果您必须调试它,您将获得不可算的代码。
因此,有很多理由不使用该宏,很少有使用它。
构造,分配和破坏都被捆绑在一起。分配可以被视为破坏 构造天真的构造,但这通常不受影响。而且您甚至没有破坏!
相关文章:
- 内联如何影响模块接口中的成员函数
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- unique_ptr实现接口时对已删除函数的引用
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 如何通过接口将函子分配给函数对象
- 如何创建一个接口,允许我访问C++中的按钮(和其他ui)函数,该函数是使用python中的MFC实现的
- C++接口的工厂函数实现
- 对已定义的接口析构函数的未定义引用
- 必须具有泛型接口的函数,但必须根据传递的子类(不知道它们是什么!)以不同的行为 - C++
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- 在接口文件中使用模板时出现"not a type"错误的函数指针
- 从 COM 接口中的函数返回多个值
- 为什么在将多态行为与指向接口的指针一起使用时没有调用析构函数?
- 这是重载提供与非静态成员函数相同接口的静态成员函数的优雅方法吗?
- 从多个不同的实现类 c++ 调用接口函数
- 单冒号是什么意思 c++ 函数接口
- 编写现代函数接口以"produce a populated container"
- 为什么std::vector的构造函数接口在C++11中发生了变化
- 传递函数接口函数的指针
- 为什么shared_ptr无法解析函数接口中的继承关系?