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

标签 c++ enums

<分区>

我一直在尝试计算我正在转换为 JAVA 的这部分 C++ 代码。方法调用 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)..

最佳答案

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

附加引用:How to use enums as flags in C++?

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

关于C++ 多个枚举元素作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39880057/

相关文章:

c++ - 我怎样才能用静态变量(C++)干掉这些函数?

c++ - 如何构建 OpenGL + GLEW + GLFW 程序,以便在带有 exe 的文件夹中不需要 glfw3.dll?

c++ - 具有任何返回类型和任何参数的 Derived Functor

mysql - 如何在 MySql 中选择 ENUM 类型的值数?

c# - 如何获取已定义枚举的数量?

android - 如何在 GreenDAO 中映射 Enum

c++ - 通过赋值运算符插入索引处的 std::vector

c++ - OpenCL clGetPlatformIDs 给出大约 230 个 valgrind memcheck 错误

swift - 检查给定的元类型是否为枚举

java - 如何在具有枚举字段的实体上使用 JPA CriteriaQuery 填充 DTO 类字符串字段?