C++;从本机类型派生 在一些C++代码中,我使用整数存储大量的变化数据。 为了分析我的程序,我想记录对某些变量的某些更改,例如某个值的赋值频率,以及该赋值的冗余频率(新值与旧值相同)

C++;从本机类型派生 在一些C++代码中,我使用整数存储大量的变化数据。 为了分析我的程序,我想记录对某些变量的某些更改,例如某个值的赋值频率,以及该赋值的冗余频率(新值与旧值相同),c++,class,C++,Class,如果类型是一个类Foo,我只需要派生一个新的LoggingFoo并将日志数据添加到我感兴趣的成员函数中,然后调用父成员函数。 我必须更新我的代码才能使用新类型,但只要我最初与typedefs保持一致,那就是一行更改 我的问题是,我想把日志添加到int中。变量不能从C++中的内置类型派生出来(你可以吗?)/P> 我的问题是是否有一种从基本类型(int、float、double等)派生的聪明方法 解决方案可能是定义一个新类,该类实际上是一个int。。它定义了int可以执行的每个操作,并将该操作应用于

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

我的问题是,我想把日志添加到int中。变量不能从C++中的内置类型派生出来(你可以吗?)/P> 我的问题是是否有一种从基本类型(int、float、double等)派生的聪明方法

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


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

你不能从int派生类,但你应该能够生成一个类(例如
Integer
)通过实现Coplein的具体数据类型习惯用法from,然后将类型转换操作符从
Integer
重载到
int
,并定义从
int
Integer
的转换操作符,可以与
int
互换

下面是另一个链接,描述了书中的基本内容


还有另一个链接,我认为它非常接近于您所寻找的内容,您永远无法从基本类型派生出类似这样的内容

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.
};
模板类日志记录\u类型
{
私人:
T值;
公众:
日志记录_type(){}
日志类型(tv):值(v){}//allow myClass=T
运算符T(){return value;}//allow T=myClass
//在此处添加所需的任何运算符。
};
这将创建一个可在两个方向上转换为原始类型的模板类。您需要为代码中该类型上使用的每个操作添加日志处理和重载运算符

这可能仍然不是您想要的,因为它可以隐式地转换为int(或您指定的任何类型),因此您的代码可能会将日志int默默地转换为int,而您将留下不完整的日志。通过向构造函数添加“explicit”关键字,可以在一个方向上防止这种情况,但不能使用转换运算符执行任何类似操作。除非你把它保密。。。我还没试过。不过,做这两件事中的任何一件都会有点违背目的


编辑:自c++11以来,您可以将
显式
添加到转换运算符。

这实际上是#定义非常有用的一种情况。 我推荐

#ifdef DEBUG
#    define INTGR MyDebugIntegerClass
#else
#    define INTGR int
#endif
确保MyDebugIntegerClass可以将自身强制转换为常规int,并具有所有适当的运算符。然后,用INTGR编写代码


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

您应该查看boost的运算符:。它将允许您创建一个具有所有典型运算符的类,使其行为类似于本机整数类型。@Evan。。谢谢,总的来说,这是一个很好的资源!对于我需要的东西,我做得太多了,但如果我真的需要自己动手,这会大大减少多余的工作。这感觉非常有希望。。它的吸引力在于所有功能都是默认工作的,我需要包装的唯一功能是我想要处理自定义日志的功能。它几乎起作用了!i=i+1;可以。是的,我已经有TypeDef了,所以更容易。我的主要问题是高效地构建MyDebuggerInteger类,而不必手动包装50多个本机int运算符。(或者只是找一个已经做过的人。)没错,但还有其他事情可以做,这可能就是你(从其他人那里)获得否决票的原因。