是否有一种方法可以在超载运算符函数中接触默认运算符函数
Is there a way to reach default operator function in overloaded operator function?
我想将运算符功能包裹起来,以使其重载为调试目的。
例如:我想计算程序运行foo对象期间完成了多少=操作。
static int counter = 0;
Foo operator=(const Foo& b)
{
//Somehow call default functionality of = opreator for foo.
counter++;
}
在使运算符过载时可以仅调用默认功能。就像编写覆盖功能时覆盖功能的呼叫基本功能一样。
如果通过"默认运算符函数",您的意思是您希望operator=()
完成如果您简单地完成的一切
Foo &operator=(const Foo &) = default;
但是,此外,还没有直接的方法,因为这样的操作员只能有一个定义。
但是,您可以使用
之类的东西实现类似的效果class Counter
{
public:
Counter &operator=(const Counter &) {++counter; return *this;};
static int Count() {return counter;};
private:
static int counter;
};
and(在一个恰好具有Counter
类定义的汇编单元中
int Counter::counter = 0;
然后,只需将单个Counter
添加为类Foo
的私人非静态成员。这样,Foo
类中"违约" operator=()
的每一个用法都会增加Counter::counter
。
如果您的类Foo
是使用Counter
的唯一位置,则以上将允许计算分配Foo
的次数。您需要做的所有需要做的就是调用Counter::Count()
。
正如Caleth在评论中指出的那样,可以在类型上模板Counter
类,因此可以建立Foo
与其他类别的柜台。这也打开了使用CRTP(奇怪的重复模板模式(的门,其中Foo
可以从Counter<Foo>
派生以提供所需的功能。
有一些潜在的警告需要注意;
-
Counter
的大小将是非零的,因此Foo
的大小可能会更改。 - 您将需要确保
Counter
类的构造函数和破坏者(但是,定义它们(与Foo
;
正确工作 - 如果
Counter::count
溢出,该行为将不确定(限制可以分配课程的次数(; - 没有什么可以阻止其他代码实例化和分配
Count
,它会弄乱您的计数(尽管这种可能性如果Counter
具有所有成员private
并将类Foo
指定为friend
(。
如果提供自定义operator=
实现,则编译器不会生成默认的一个。由于不存在,因此无法访问它。
我建议将一个单独的类operator=
组成单独的类,并将其添加到class Foo
中作为字段(或基类(。
这是一种介绍基于模板的分配运算符的方法,它不会超载默认一个:
static int counter;
struct Foo
{
template<bool=false> Foo& operator=(const Foo& b)
{
// The non-debug one
return operator=(b);
}
template<> Foo& operator=<true>(const Foo& b)
{
// The debug one
++counter;
return operator=(b);
}
};
然后您可以使用
Foo f;
Foo g;
g.operator=<>(f); // This is the non-debug one
g.operator=<true>(f); // This is the non-debug one
g.operator=<false>(f); // This is the debug one
您当然可以写g = f
。
不幸的是,尽管您不能在写作时写g=<false>f;
,因此所设想的呼叫语法很难看。
注意:仅当复制构造函数完全执行副本分配运算符应该执行的操作时,这才能起作用(除了增加静态计数器外(。
Foo operator=(const Foo& b)
{
++counter;
//Somehow call default functionality of = opreator for foo.
Foo copy(b);
return copy;
//counter++;
}
您可以在线查看我的代码。
我不确定使用此问题的其他陷阱,而不是顶部提到的陷阱。批评是最欢迎的。
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载运算符new[]的行为取决于析构函数
- 构造函数和转换运算符之间的重载解析
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 是什么让一些命名函数/运算符与众不同?
- 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗
- 如何在局部类中定义友元函数运算符>>?
- 隐式转换和函数运算符
- 如何从函数运算符(x,y)返回向量元素的引用
- C++/析构函数-运算符删除
- 获取函数运算符<未定义的引用
- VS2012 std::函数运算符 bool 意外返回 true
- "Polymorphic"非成员函数/运算符,是否需要额外的重载?
- Xcode - 控制到达非无效函数运算符错误的末尾
- 重载类函数运算符兼任二传手和吸气手
- 为简单结构定义哪个复制/移动构造函数/运算符
- 关于函数/运算符重载的困惑
- 函数运算符上的未定义引用>>
- C++ 重载函数运算符和继承,无法在子类函数中正确使用它
- 如何使用另一个类的重载函数运算符(operator())