Как boost :: lexical_cast использует только один тип шаблона? - PullRequest
3 голосов
/ 21 августа 2011

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

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

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

Ответы [ 4 ]

5 голосов
/ 21 августа 2011

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

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]
3 голосов
/ 21 августа 2011
template <class Ret, class Input>
Ret lexical_cast(Input i)
{
   // ...
}

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

2 голосов
/ 21 августа 2011

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

1 голос
/ 22 августа 2011

В основном, есть три источника для параметров шаблона функции:

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

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

...