Шаблон функции C ++ с гибким типом возврата - PullRequest

Ответы [ 2 ]

10 голосов
/ 25 декабря 2010

C ++ 0x позволит вам использовать ключевое слово auto, чтобы компилятор мог определить время возврата выражения.


Для C ++ 03 я нашел единственный способ автоматизировать такой процесс - определить класс шаблона Promotion, который определяет самый сильный тип между двумя типами, а затем специализировать его для любой пары типов, которые вам могут понадобиться.

template<> class Promotion< long, int > { typedef long strongest; }
template<> class Promotion< int, long > { typedef long strongest; }

и, таким образом:

template< typename T1, typename T2 >
Promotion<T1,T2>::strongest function( const T1 &a, const T2 &b ) { ... }

Если вы решите попробовать это решение, я бы предложил сгенерировать специализации Акции с автоматически сгенерированным заголовочным файлом.


Редактировать: я перечитал вопрос после прочтения другого (теперь удаленного) ответа:

Вы не можете вернуть тип переменной меньшего размера. Это потому, что значение переменных будет найдено только во время выполнения, а тип возвращаемой функции должен быть определен во время компиляции.

Предлагаемое мной решение всегда будет возвращать самый сильный тип между типом двух переменных.

1 голос
/ 25 декабря 2010

Как уже было сказано, вы хотите взять более общий тип.Мол, int и double должны стать double;char* и string должны стать string.Это работает с моим promote<> шаблоном.Просто напишите

template <class T1, class T2>
typename promote<T1, T2>::type getMin(T1 const& a, T2 const& b) {
  if(a < b)
    return a;
  return b;
}

Это всегда вернет копию, даже если T1 и T2 одного типа (например, string), поэтому я бы перегрузил его для неконстантныхаргументы типа

template <class T>
T &getMin(T &a, T &b) {
  if(a < b)
    return a;
  return b;
}

Эти два варианта представляются разумной конфигурацией.Если вы хотите иметь немного более рискованное, но в большинстве случаев более эффективное решение, вы можете принять T const&, также принимая временные.Если вы затем используете его как getMin(a + b, b + c), который может пропускать временные значения, и используете результат напрямую, то все в порядке.Результат пригоден для использования и может быть скопирован в локальную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...