C++派生自本机类型

SPW*_*ley 7 c++ class

在某些C++代码中,我使用整数来存储大量不断变化的数据.为了分析我的程序,我想记录某些变量的某些更改,例如指定某个值的频率,以及该赋值冗余的频率(新值与旧值相同).

如果类型是类Foo,我只是派生一个新的LoggingFoo并将我的日志记录数据添加到我感兴趣的成员函数中,然后调用父成员函数.我必须更新我的代码才能使用新类型,但只要我最初与typedef一致,那就是单行更改.

我的问题是我想要添加日志记录的变量是一个int.您无法从C++中的内置类型派生(可以吗?)

我的问题是,是否有一种聪明的方法来从基本类型(int,float,double等)派生.

解决方案可能是定义一个有效地为int 的新类.它定义了int可以执行的每个操作,并将该操作应用于私有int数据成员.这个策略可行,但也许其他人已经创建了这样的类,我可以使用"fakeint.h"头文件定义.在我自己实现之前,是否有某种"代理本机类包装"类型定义已经可用?

我确实认识到我的代理int当然不能与int互换使用,特别是因为现有的函数定义都期望一个int ..但对于我的app,这都是在一个内部循环中,它做了很多简单的native + - *^ =操作,不用作函数参数或任何东西.

Jef*_*ard 9

你不能从int派生一个类,但是你应该能够创建一个Integer可以互换的类(例如),int通过实现C++的高级C++中的具体数据类型成语:编程样式和成语,然后通过重载类型转换操作符来实现Integerint和从限定了转换操作符intInteger.

这是另一个描述本书基本习语的链接

而另一个我认为非常接近您正在寻找的链接http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Int-To-Type


Dan*_*son 8

像这样......

template <typename T> class logging_type
{
private:
   T value;
public:
   logging_type() { }
   logging_type (T v) : value(v) { }  // allow myClass = T
   operator T () { return value; }  // allow T = myClass
   // Add any operators you need here.
};
Run Code Online (Sandbox Code Playgroud)

这将创建一个可在两个方向上转换为原始类型的模板类.您需要为代码中的该类型使用的每个操作添加日志记录处理和重载运算符.

这仍然可能不是您想要的,因为它可以隐式转换为int(或您指定的任何类型),因此您的代码可能会将您的logging int静默转换为int,并且您将留下不完整的日志.您可以通过向构造函数添加"explicit"关键字来向一个方向阻止此操作,但您无法对转换运算符执行任何类似操作.除非你把它私有化......我还没试过.尽管如此,做其中任何一件事都会失败.

编辑:从c ++ 11开始,您可以添加explicit到转换运算符.

  • 这感觉非常有前途..它具有吸引力,默认情况下一切正常,我需要包装的唯一函数是我想要处理自定义日志记录的函数.它**几乎**工作!I = I + 1; 没关系 cout << i; 没关系 但是例如i + = 1; 或者i ++; 才不是.尽管如此,这可能适用于填充大多数操作员,我可以手动处理其余的操作. (2认同)