我的课程如下:
class SignalProcessor
{
//....
bool memberBool;
uint32_t memberUint32;
int memberArray[10];
//...
float memberfloat;
};
SignalProcessor
实现用于控制系统,具有一些复杂的算法。
现在我必须覆盖那些成员值的 某些 ,其他一些值来自另一个应用程序,用于诊断/调试目的。
一种方法是在代码中的每个位置使用#ifdef
或if... else..
一堆来污染整个实现。
所以我很好奇我是否只能在SignalProcessor标头内做任何事情来覆盖这些值,如下所示。
SignalOverride< bool, true > memberBool;
SignalOverride< uint32_t, false> memberUint32;
SignalOverride< int, true> memberArray[10];
// SignalOverride
template <typename T, bool overrideOn >
class SignalOverride
{
T operator=(const T& value )
{
if( !overrideOn )
{
m_signal = value;
}
else
{
/* m_signal = ???
Not entirely sure how to assign values here from other application.
*/
}
return *this;
}
operator T () const
{
return m_signal ;
}
// ...
private:
T m_signal;
}
另一个应用程序在下面的几个C结构中具有相同的信号名称,如果覆盖选项为true,我将不得不使用它。
struct Values1
{
bool memberBool;
uint32_t memberUint32;
};
struct Values2
{
int memberArray[10];
};
我对任何其他设计/解决方案持开放态度,除了我不想浏览多个源文件中的每个地方并执行if...else...
我只能使用 C++98
(可怜我)
答案 0 :(得分:0)
你的第一个任务是真正找到&#34;如何在这里从其他应用程序中分配值&#34;,因为在你完成之前,整个问题绝对没有实际意义。
但是假设事实证明你可以像现在一样命名一个对象,#ifdef
确实是传统的方法。 if
会使情况更糟,和会对运行时造成不利影响。这些是你唯一真正的选择(没有一些超级庞大的魔术类层次结构和完全不可读的模板元),因为C ++不支持覆盖数据成员。
所以只需使用#ifdef
。
如果您发现有太多地方可以写#ifdef
,或许这表明: