2012-03-06 171 views
4

我想创建针对变异型结构的辅助包装,所以这种类型的签名会召唤必要的转换,如:C++明确的函数签名

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); 

有一些问题。

如何设计一个干净的包装,如果我需要作为布尔和整数类型的布尔和未签名的int/uints/longs/longlongs处理布尔?

对于类构造函数,我可以使用explicit关键字,但是我必须在我正在更新的代码中使用函数int。

+6

我认为这里的问题是'BOOL'类型只是'int'的'typedef'。我不认为在这种情况下有什么办法可以消除这两者的歧义,尽管我可能是错的。 – templatetypedef 2012-03-06 03:45:06

+0

我看不到问题。我尝试用'bool','int'和'__int64_t'重载一个函数,并且每次都能够区分每一个函数。 – howardh 2012-03-06 03:56:22

+0

@ howardh-请注意,该示例使用'BOOL'而不是'bool'。 'BOOL'是'int'的微软'typedef',因此是这个问题。 – templatetypedef 2012-03-06 04:01:04

回答

1

正如评论所指,你的问题的答案在于区分“bool”(真正的布尔类型)和BOOL(int的MS类型定义)。

尽管如此,我在代码中完成了完全相同的事情。如果您在MS平台上,请考虑使用_variant_t或CComVariant:两者基本上都是您想要的。我最终做了一个自己的转换类,其模板通过默认的方式传递给底层的父类(本例中为_variant_t),并为没有内联转换为MS类类型的构造类型添加特化。您将不得不为每种类型添加专业化,但在底层类型中没有转化,但通常不会太差。

我要补充:

优势做这种方式的是,不会有隐式转换。如果类型匹配显式覆盖,它将被使用。否则,它将匹配模板,并传递给MS类型。如果MS类型不能接受传入的类型,那么您将收到编译时错误,并知道需要解决的问题。