2016-02-18 3 views
0

У меня есть перегруженная пара функций, которые принимают один аргумент. Один занимает uint64_t. Другой принимает int64_t. Когда я передаю функцию uint32_t функции, она корректно помечена как неоднозначная.Как устранить неоднозначность перегрузки функции

Как устранить эту двусмысленность, не прибегая к шаблонам? Я могу написать неглубокую оболочку, которая использует свойства типа для ее разрешения, но я бы предпочел. Я бы предпочел для подписанных типов разрешить подписанную перегрузку и неподписанные типы для решения неподписанной перегрузки.

Кроме того, я бы предпочел не иметь перегрузки для каждого целочисленного типа.

+1

Сделать перегрузку, которая принимает 'uint32_t' и перенаправляет ее на функцию, которую вы хотите вызвать? – NathanOliver

+3

Вам не нужна перегрузка для каждого целочисленного типа. Только те, у которых показатель конверсии больше или равен значению «int». Это 6 перегрузок. http://en.cppreference.com/w/cpp/string/basic_string/to_string – Brian

+0

@Brian Как это работает, когда короткий передается функции? – Graznarak

ответ

2

У вас есть несколько вариантов в вашем распоряжении:

  1. Требовать вызывающий явно привести либо int64_t или uint64_t.
  2. Обеспечьте перегрузку для каждого целочисленного типа
  3. Используйте шаблоны и либо SFINAE, либо отправку тегов при подписке.

(3) было бы (на мой взгляд) самым ясным, (2) было бы самым многословным, и (1) потребовало бы самой работы над вашими пользователями.