我使用以下宏来生成功能代码
#define EXTRACT_INSTRUCTION32_FIELD(insName,fieldName,fieldOffset) \
insName##Instruction::##fieldName val; \
val = static_cast<##insName##Instruction::##fieldName##>((hexIstruction & ##insName##Mask_##fieldName) >> fieldOffset); \
return val
但我不想总是使用return val
。我也不想将这个宏拆分为2个宏。我怎么能这样做?想要使用一些isRet
< / p>
#define EXTRACT_INSTRUCTION32_FIELD(insName,fieldName,fieldOffset,isRet) \
insName##Instruction::##fieldName val; \
val = static_cast<##insName##Instruction::##fieldName##>((hexIstruction & ##insName##Mask_##fieldName) >> fieldOffset); \
if (##isRet)\
return val
我不喜欢这种解决方案,它会降低性能 - 任何建议都可以做到这一点吗?
答案 0 :(得分:0)
我倾向于使用更多C ++正确的方法来使用内联函数或模板,这类似于:
template <class T, U, V>
U extractInstruction32Field(T insName, U fieldName, V fieldOffset, W hexInstruction, bool isRet = false)
{
U retval;
retval = static_cast<U>((hexInstruction& insName::fieldName) >> fieldOffset);
if isRet { return retval; }
}
请注意isRet
布尔值默认为false,因此只有在您选择使用它时才会返回值。
在不知道你的面具(##Mask_
)值是什么的情况下,上面仅仅是示例性的,我不应该认为它有效,但是它应该指向一个新的途径。
这种方法将允许类型安全和体面的错误检查,其中定义不能很好地发挥。