将Variant转换为bool

时间:2015-09-04 15:51:57

标签: boolean c++builder c++builder-10-seattle

如何在C ++ Builder 10中将Variant转换为bool?

在旧的bcc32编译器中,我使用以下代码检查是否启用了某些通用TComponent:

if ((bool)GetPropValue(c, "Enabled", false))
    do_something();

但是,在升级到C ++ Builder 10并启用新的基于Clang的编译器之后,我收到以下错误:

[CLANG Error] VclHelpers.cpp(1375): ambiguous conversion for C-style cast from 'System::Variant' to 'bool'

完整的编译器消息表明Variant的36个转换运算符被视为合法候选者:operator double()operator wchar_t*等。

1 个答案:

答案 0 :(得分:3)

问题是Variant提供了太多转换运算符。特别是,以下运算符转换为bool模糊:

__fastcall operator bool() const;
__fastcall operator signed char*();
__fastcall operator unsigned char*();
// etc. - Variant has similar operators for short, int, long, float, double...
// It calls these "by ref" conversions.

据我所知,非const重载通常优于const重载,但对于非const convertible-to-bool指针转换的> 1替代以及const bool转换,转换是不明确的。 / p>

Variant设置转换的方式可能是错误的,因为它们无法在不含糊不清的情况下使用,但在@ user2672165&s和@的帮助下Remy Lebeau的评论,有几种解决方法:

// Convert to int instead of bool.
if ((int)GetPropValue(c, "Enabled", false)) {}

// Make the Variant const, to avoid the ambiguous non-const conversions.
if (const_cast<const Variant>(GetPropValue(c, "Enabled", false))) {}

// Explicitly invoke the desired conversion operator.
if (GetPropValue(CheckBox1, "Enabled", false).operator bool()) {}

// Use TRttiProperty instead of Variant.
RttiContext ctx;
if (ctx.GetType(c->ClassType())->GetProperty("Enabled")->GetValue(c).AsBoolean()) {}