【发布时间】:2012-03-06 03:36:38
【问题描述】:
我想针对变体类型结构创建一个辅助包装器,以便类型签名会调用必要的转换,例如:
variant CreateVariant(bool value);
variant CreateVariant(int value);
variant CreateVariant(char *value);
问题在于 bool 和 int,因为它们是隐式可转换类型...
所以对于像这样的代码:
variant a = CreateVariant((BOOL)value);
variant a = CreateVariant((__int64)value);
variant a = CreateVariant(1);
有一些问题。
如果我需要将 bool 处理为 boolean 并将 unigned/signed int/uints/longs/longlongs 处理为整数类型,我该如何设计一个干净的包装器?
对于类构造函数,我可以使用 explicit 关键字,但我必须在要更新的代码中使用函数。
【问题讨论】:
-
我认为这里的问题是
BOOL类型只是typedef的int。我不相信在这种情况下有任何方法可以消除两者的歧义,尽管我可能是错的。 -
我看不到问题所在。我试过用
bool、int和__int64_t重载一个函数,每次都能区分出来。 -
@howardh- 请注意,该示例使用
BOOL而不是bool。BOOL是int的 Microsofttypedef,因此存在问题。 -
添加一个模板
CreateVariant,它将捕获与非模板版本完全匹配的所有内容。 -
您为什么不阅读 C++ 中的重载解析规则?没有问题。在这里,记住这一点:重载通过识别一组候选函数调用(可以使用这些参数调用的函数)来工作。在这些候选人中,必须有一个在每个论点中至少与其他候选人一样好,并且在至少一个论点中严格优于其他候选人。如果没有这样的功能或不止一个,这是一个可诊断的错误。
标签: c++ type-conversion wrapper