【发布时间】:2014-12-03 16:00:53
【问题描述】:
我有:
class C
{
C(long){...};
C(double){...};
:
}
很遗憾,
C c{5}; // error! ambiguous overload
(这很可怕,不是吗?整数类型肯定有利于构造函数采用更高精度的整数参数。)
如何正确地将整数参数和浮点参数正确转发给各自的构造函数?
编辑:也许我把问题简单化了。它最初来自this enquiry。我正在包装 Python 原语,例如 Float Long String,重要的是初始化被转发到正确的原语。同时,由于这是一个通用的包装器,我不希望消费者为了避免内部陷阱而担心类型转换。
正如 Mike Seymour 所指出的,SFINAE 提供了一种处理此问题的技术。
非常感谢 FreeNode C++ 频道上的 doug64k 提供以下解决方案:
http://ideone.com/QLUpu2 http://ideone.com/TCigR3 http://ideone.com/oDOSLH
我会在明天找到线索时尝试将这些作为答案。
【问题讨论】:
-
你让编译器猜测你是否忘记了 5 之后的 L 或 .0。我非常喜欢不需要编译器猜测的代码和不需要猜测的编译器.
-
@gnasher729,我尽量保持简单。 C{someInt} 怎么样?
-
@Pi:我只需要
C{long(someInt)}或C{double(someInt)},这取决于调用者想要的。试图打破该语言的类型转换规则绝非易事(尽管通过一些可怕的 SFINAE 使用,您几乎可以得到您认为想要的东西)。 -
@MikeSeymour 为什么可怕? stackoverflow.com/a/14603258/4224575
标签: c++ templates c++11 constructor-overloading