У меня есть:
class C
{
C(long){...};
C(double){...};
:
}
К сожалению,
C c{5}; // error! ambiguous overload
(Это довольно ужасно, не так ли? Целочисленный тип, безусловно, должен отдавать предпочтение конструктору, принимающему целочисленный аргумент более высокой точности.)
Как правильно иметь целочисленные аргументы и аргументы с плавающей запятой, чтобы правильно передать их соответствующим конструкторам?
РЕДАКТИРОВАТЬ: Возможно, я упростил вопрос. Первоначально он взят из этого запроса. Я оборачиваю примитивы Python, такие как Float Long String, и важно, чтобы инициализация перенаправлялась в правильный примитив. В то же время, поскольку это предназначено для общего использования, я не хочу, чтобы потребитель беспокоился о приведении типов, чтобы избежать внутренних ловушек.
Как отмечает Майк Сеймур, SFINAE предлагает метод решения этой проблемы.
Большое спасибо doug64k на канале FreeNode C++ за следующие решения:
http://ideone.com/QLUpu2 http://ideone.com/TCigR3 http://ideone.com/oDOSLH
Я попытаюсь превратить их в ответ, когда завтра найду след.
C{long(someInt)}
илиC{double(someInt)}
, в зависимости от того, что хочет вызывающий. Попытка обойти правила преобразования типов языка будет совсем не простой (хотя вполне возможно, что вы можете получить то, что, как вы думаете, хотите, с каким-то отвратительным использованием SFINAE). - person Mike Seymour   schedule 03.12.2014