2009-07-26 52 views
7

在一些C++代码中,我使用整数来存储大量不断变化的数据。 为了分析我的程序,我想记录某些变量的某些变化,例如某个值被赋值的频率以及赋值多长时间一次(新值与旧值相同)。C++派生自本机类型

如果类型是一个Foo类,我只是派生一个新的LoggingFoo并将我的日志数据添加到我感兴趣的成员函数中,然后调用父成员函数。 我不得不更新我的代码以使用新类型,但只要我最初与typedefs一致,那是一个单行更改。

我的问题是,我想添加日志记录的变量是一个int。你不能从C + +内置类型派生(你能吗?)

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

的解决方案可能是定义一个新的类,它有效是一个int ..它定义操作一个int能做的,只是应用于的操作私人int数据成员。 这个策略可以工作,但也许其他人已经做了这样一个类,我只能使用“fakeint.h”头文件定义。在我自己实现它们之前,是否有这样的“代理本地类包装器”类型定义已经可用?

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

+1

你应该看看boost的操作符:http://www.boost.org/doc/libs/1_39_0/libs/utility/operators.htm。 它可以让你创建一个具有所有典型运算符的类,使它像一个本地整数类型一样工作。 – 2009-07-26 02:18:08

+0

@Evan ..谢谢,这是一个很好的资源!过度需要我需要的东西,但如果我确实需要推出自己的产品,则会显着减少冗余工作。 – SPWorley 2009-07-26 02:21:22

回答

6

事情是这样的......

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. 
}; 

这将创建一个模板类,可以在两个方向上转换为原始类型。您需要在代码中为该类型中使用的每个操作添加日志记录处理和重载操作符。因为它可以隐式转换为int(或者你指定的任何类型),所以你的代码可能会默默地将你的日志int转换为一个int,并且你会留下不完整的日志。您可以通过向构造函数中添加一个“显式”关键字来防止这种情况,但是您无法执行与转换运算符类似的任何操作。除非你可能让它变成私人的......我还没有尝试过。尽管做这些事情中的任何一个都会有点失败。

编辑:由于C++ 11,你可以添加explicit转换操作。

+2

这感觉非常非常有希望..它具有吸引力,默认情况下一切正常,我需要包装的唯一funcs是我想要处理自定义日志记录的。 它**几乎**作品! I = I + 1;没问题。 cout << i;没问题。但是例如i + = 1;或i ++;才不是。 不过,这对于填补大部分操作员来说可能很好,我可以手动处理余下的操作。 – SPWorley 2009-07-26 03:02:42

-1

你永远无法从原始类型

得出基本 Idioms另一个链接
+2

确实如此,但还有其他的事情可以做,这可能就是为什么你从其他人那里得到了投票。 – 2009-07-26 03:42:01

3

这实际上是一种情况,其中#define是非常有帮助的。 我建议

#ifdef DEBUG 
# define INTGR MyDebugIntegerClass 
#else 
# define INTGR int 
#endif 

确保MyDebugIntegerClass可以施展自己到正规的INT,并拥有所有合适的运营商。然后,用INTGR编写你的代码。

在调试模式下,您将获得所有类的日志记录,但在发布模式下,您将得到一个纯粹基本的int。