C ++多个枚举元素作为参数传递?

时间:2016-10-05 17:13:58

标签: c++ enums

我一直试图将这部分C ++代码转换为JAVA。方法调用PrintItem()DWORD作为第二个参数,但在此特定示例中,它允许同时使用enum中的两个元素?

我在following answer引用Ashish试图得到一些澄清,但它没有多大帮助。

enum
    {
        PRINT_ENTRY         = 0x0001,
        PRINT_PREPEND       = 0x0002,
        PRINT_APPEND        = 0x0004,
        PRINT_PRECOMMENTS   = 0x0008,
        PRINT_POSTCOMMENTS  = 0x0010,
        PRINT_SPECIAL       = 0x0010,
        PRINT_DEFAULT       = PRINT_ENTRY | PRINT_PREPEND | PRINT_APPEND | PRINT_PRECOMMENTS | PRINT_POSTCOMMENTS | PRINT_SPECIAL
    };

传入两个枚举元素的方法调用?这是我不明白的。

bResult = PrintItem( pMergeItem, PRINT_PREPEND | PRINT_ENTRY );

方法声明

bool PrintItem( CItem* pItem, DWORD options = PRINT_DEFAULT );

和定义,稍微减少了一点:

// Prints an individual item to the invoice (based on appropriate template settings)
bool CPrintRptInvoice::PrintItem( CItem* pItem, DWORD options )
{
    bool bResult = true;
    CString strKey = GetItemKey( pItem );

    DWORD getOpts = CPrintTemplate::GE_NONE;
    if ( options & PRINT_ENTRY )
        getOpts |= CPrintTemplate::GE_ENTRY;
    if ( options & PRINT_PREPEND )
        getOpts |= CPrintTemplate::GE_PREPEND;
    if ( options & PRINT_APPEND )
        getOpts |= CPrintTemplate::GE_APPEND;

    CString strEntry = m_pTemplate->GetEntry( strKey, getOpts );

    // print any prefix first
    if ( options & PRINT_PRECOMMENTS ) 
        PrintComment( pItem->GetInvoicePrefix() );

    // print main entry
    if ( strEntry.IsEmpty() )
    {
        if ( ( options & PRINT_ENTRY ) && !m_pTemplate->EntryExists( strKey ) )
        {
            //Code to print Entries, not touching options anymore.
        }
    }

    // print any special cases
    if ( bResult && ( options & PRINT_SPECIAL ) )
    {
        //Code to print special cases, not touching options anymore...
    }

    // print any suffix last
    if ( options & PRINT_POSTCOMMENTS ) 
        PrintComment( pItem->GetInvoiceSuffix() );

    return bResult;
}

我的问题是 - 如何处理枚举的多个参数?我没有看到它处理该方法定义中的任何一个!我剪掉的东西根本不会触及options

我想我很困惑,因为我认为options是某种集合,不是吗?那么,你怎么做到这一点,只是得到正确的元素:if ( options & PRINT_PRECOMMENTS ) ..

1 个答案:

答案 0 :(得分:2)

这只是一个按位OR,它允许将多个枚举值组合到内部的整数中(因此在函数调用中仍然只是一个参数)。这种枚举也称为旗帜。它们通常以具有仅代表一位的值的成员为特征:a = 1,b = 2,c = 4,d = 8,e = 16,......因此它们可以组合;当转换为int时,a | b为3。 在函数体内部,然后使用按位&运算符单独查询各个标志。

其他参考:How to use enums as flags in C++?

顺便说一句。这个概念在Java中看起来非常相似:Implementing a bitfield using java enums