Как boost::lexical_cast принимает только один тип шаблона?

Я просмотрел беспорядок, который представляет собой lexical_cast.hpp, и это продолжает ускользать от меня.

Как lexical_cast, чье «базовое определение» принимает как источник, так и место назначения шаблона, может принимать такие грамматики, как lexical_cast<int>("7")? Я не понимаю, как ему может понадобиться только шаблонный тип возвращаемого значения, и вам не нужно указывать тип параметра, не делая чего-то незаконного, например, частичной специализации шаблона.

Примечание. Я понимаю, как вы можете сделать это с одним типом шаблона и перегрузками для разных параметров, но я не понимаю, как lexical_cast основан на функции шаблона, требующей как исходного, так и целевого типов шаблонов.


person 0x5f3759df    schedule 21.08.2011    source источник


Ответы (4)


Аргументы шаблона можно вывести из аргументов функции:

template <typename T>
void foo(const T& x)
{
    // T is the type of X
}

foo(5); // T is be int
foo("hello"); //T is const char[6]
person GManNickG    schedule 21.08.2011

template <class Ret, class Input>
Ret lexical_cast(Input i)
{
   // ...
}

Тип Input выводится на основе переданного аргумента.

person Arvid    schedule 21.08.2011

Это потому, что компилятор может вывести тип аргументов из аргументов, но только если это возможно и не является двусмысленным. Компилятор не выведет возвращаемый тип. Вот почему тип возвращаемого значения требуется, а типы аргументов — нет.

person Dani    schedule 21.08.2011

По сути, существует три источника параметров шаблона функции:

  1. Явно предоставленные аргументы шаблона.
  2. Значения по умолчанию
  3. Выводится из аргументов функции

Шаблон функции может быть создан, если все параметры шаблона могут быть разрешены. Не обязательно, чтобы каждый аргумент шаблона разрешался из одного и того же источника. Например. в случае boost::lexical_cast<OutType, InType> InType обычно выводится из аргумента функции, а OutType указывается явно.

person MSalters    schedule 22.08.2011