2011-08-21 50 views
3

我已經看透了這個lexical_cast.hpp這個混亂,並且這一直在逃避我。boost :: lexical_cast如何只採用一種模板類型?

lexical_cast(其基本定義既包含模板源又包含目標)如何能夠接受語法,如lexical_cast<int>("7")?我不明白它是如何只需要一個模板化的返回類型,並且不需要給出參數的類型,而不需要執行諸如部分模板特化等非法操作。

注意:我瞭解如何使用單個模板類型完成此操作併爲不同的參數重載,但我無法理解lexical_cast如何基於需要源和目標模板類型的模板函數。

回答

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] 
2

這是因爲編譯器可以推斷從參數參數的類型,但只有當它是可能的,沒有歧義。編譯器不會推斷返回類型。這就是爲什麼返回類型是必需的,但參數的類型不是。

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

Input類型是基於在傳入的參數推斷

1

基本上有三個來源爲函數模板參數:

  1. 明確規定模板參數。從功能參數

函數模板演繹出

  • 默認值
  • 可以被實例化,如果所有的模板參數都可以解決。不需要每個模板參數都從同一個源解析。例如。在boost::lexical_cast<OutType, InType>的情況下,InType通常從函數參數中推導出來,並且明確提供了OutType

  • 相關問題