将CFTyPrEF转换为目标C++中的布尔

将CFTyPrEF转换为目标C++中的布尔,c++,objective-c,casting,objective-c++,core-foundation,C++,Objective C,Casting,Objective C++,Core Foundation,我想将objective c代码转换为objective cpp,并在我的应用程序中使用它。给定以下代码: CFTypeRef dynamicValue = (__bridge CFTypeRef)([[NSBundle bundleWithPath:aStr] objectForInfoDictionaryKey: @"CFPlugInDynamicRegistration"]); BOOL removeFlag = NO; if(dynam

我想将objective c代码转换为objective cpp,并在我的应用程序中使用它。给定以下代码:

        CFTypeRef dynamicValue = (__bridge CFTypeRef)([[NSBundle bundleWithPath:aStr] objectForInfoDictionaryKey: @"CFPlugInDynamicRegistration"]);

        BOOL removeFlag = NO;

        if(dynamicValue == nil)
        {
            removeFlag = NO;
        }
        else if( CFGetTypeID(dynamicValue) == CFBooleanGetTypeID()  )
        {
            removeFlag = CFBooleanGetValue(dynamicValue);
        }
        else if( CFGetTypeID(dynamicValue) == CFStringGetTypeID()  )
        {
            removeFlag = ( [[(__bridge NSString*)dynamicValue lowercaseString] isEqualToString:@"yes"] ? YES:NO);
        }

        if( removeFlag )
        {       
            [unloadedArray addObject:aStr];
            [sortedArray removeObjectAtIndex:hoge];
        }
将文件名从file.m更改为file.mm并生成时出错:调用“CFBooleanGetValue”时没有匹配的函数

我试图包括,但我得到相同的错误,我想这是一个ifdef的问题


你知道有什么方法可以在不丢失函数的情况下进行强制转换吗?我是否应该尝试使用相同的函数?

您可以使用此cfNumberTargetTypeID

 NSString *aStr = @"";

    CFTypeRef dynamicValue = (__bridge CFTypeRef)([[NSBundle bundleWithPath:aStr] objectForInfoDictionaryKey: @"CFPlugInDynamicRegistration"]);

    BOOL removeFlag = NO;

    if(dynamicValue == nil)
    {
        removeFlag = NO;
    }
    else if( CFGetTypeID(dynamicValue) == CFNumberGetTypeID()  )
    {
        removeFlag = [(__bridge NSNumber *)dynamicValue boolValue];
    }
    else if( CFGetTypeID(dynamicValue) == CFStringGetTypeID()  )
    {
        removeFlag = ( [[(__bridge NSString*)dynamicValue lowercaseString] isEqualToString:@"yes"] ? YES:NO);
    }

    if( removeFlag )
    {
        [unloadedArray addObject:aStr];
        [sortedArray removeObjectAtIndex:hoge];
    }

< C++ >从空隙转换到这里:CFTyPrEF到A 此处不同类型的指针:CFBooleanRef又名_CFBoolean*需要显式 铸造因此,这将解决问题:

removeFlag = CFBooleanGetValue(static_cast<CFBooleanRef>(dynamicValue));

这是用Objective-C和Objective-C++编译的

Objective-C++没有自动框架链接。
你需要包括和手动链接CopeFoundation框架。

你的第一个例子不会编译在ObjultC++中,因为CFBoLangangeTalk是我问题的根源…关于第二个问题——假设国王是NSNumber或NSString安全吗?这意味着布尔值有点像NSNumber?@benams:事实上,我在一个.mm文件中尝试了我的第一个示例,它编译起来没有问题如果该值为其他值,则不会执行任何If块,布尔变量保持为“否”。这与代码中的行为相同。@benams:是的,属性列表中的布尔值作为NSNumberWhat的实例返回,关于CFGetTypeIDdynamicValue==CFBooleanGetTypeID,您的示例仅处理CFNumberGetTypeID和CFStringGetTypeID,而我的问题发生在CFBooleanGetTypeIDBool为数字0,1时,这与我的经验不同。我把OP的代码放到main.mm文件中。为CFBooleanGetValue参数添加静态强制转换后,代码编译和链接没有问题。不需要手动链接。@MartinR,啊,对了!我认为所有的应用程序都与CoreFoundation有关联。基础H已经包含了岩心。
id dynamicValue = [[NSBundle bundleWithPath:@"path"] objectForInfoDictionaryKey: @"CFPlugInDynamicRegistration"];
BOOL removeFlag = NO;
if ([dynamicValue isKindOfClass:[NSNumber class]]) {
    removeFlag = ((NSNumber *)dynamicValue).boolValue;
} else if ([dynamicValue isKindOfClass:[NSString class]]) {
    removeFlag = [((NSString *)dynamicValue).lowercaseString isEqualToString:@"yes"];
}