Разрешение перегрузки для целочисленных типов происходит в двух категориях, которые можно очень кратко суммировать до
- Повышение: это преобразование типов, меньших
int
к int
или unsigned int
, в зависимости от того, может ли int
хранить все значения типа источника.
- Преобразование: это преобразование из любого целочисленного типа в другой целочисленный тип.
Аналогично, преобразование для типов с плавающей запятой происходит по двум категориям
- Акция: это конверсия из
float
в double
- Преобразование: это преобразование из любого типа с плавающей запятой в другой тип с плавающей запятой
И есть преобразование из целого числа в плавающее или обратно. Это оценивается как конверсия, а не продвижение по службе. Поощрение оценивается лучше, чем конверсия, и там, где требуется только продвижение, этот случай будет предпочтительным. Таким образом, вы можете использовать следующие конструкторы
PointList( int maxVals );
PointList( unsigned int maxVals );
PointList( long maxVals );
PointList( unsigned long maxVals );
PointList( double maxDist );
PointList( long double maxDist );
Для любого целочисленного типа следует выбрать первую группу конструктора. И для любого типа с плавающей точкой, это должно выбрать вторую группу конструкторов. Ваши исходные два конструктора могут легко привести к неоднозначности между float
и unsigned int
, если вы передаете, например, int
. Для другого конструктора с двумя аргументами вы можете использовать свое решение, если хотите.
Тем не менее, я бы тоже использовал фабричную функцию, потому что определение типа значения параметра довольно хрупко, я думаю. Большинство людей ожидают, что следующий результат будет равен
PointList p(floor(1.5));
PointList u((int)1.5);
Но это привело бы к другому положению вещей.