boost :: lexical_cast如何只采用一种模板类型?

时间:2011-08-21 04:39:22

标签: c++ templates generics boost template-specialization

我查看了lexical_cast.hpp的混乱,这继续让我感到厌烦。

lexical_cast(其“基本定义”同时采用模板源和目标)如何能够接受lexical_cast<int>("7")等语法?我不知道它怎么只需要一个模板化的返回类型,并且不需要你给出参数的类型而不做像部分模板特化这样的非法操作。

注意:我理解如何使用单个模板类型和不同参数的重载来完成此操作,但我无法理解lexical_cast是如何基于需要源模板类型和目标模板类型的模板函数。

4 个答案:

答案 0 :(得分:5)

模板参数可以从函数参数中推导出来:

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]

答案 1 :(得分:3)

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

Input类型是根据传入的参数推断出来的。

答案 2 :(得分:2)

这是因为编译器可以从参数中推断出参数的类型,但只有在它可能且不含糊不清的情况下。编译器不会推断返回类型。这就是为什么返回类型是必需的,但参数的类型不是。

答案 3 :(得分:1)

基本上,函数模板参数有三个来源:

  1. 明确提供模板参数。
  2. 默认值
  3. 从函数参数中推断
  4. 如果可以解析所有模板参数,则可以实例化函数模板。不需要从同一源解析每个模板参数。例如。在boost::lexical_cast<OutType, InType>的情况下,InType通常是从函数参数中推导出来的,并且OutType是明确提供的。